tags:

views:

72

answers:

2

Are there any books or articles that show you how to use NUnit to test entire features of a program? Is there a name for this type of testing?

This is different from the typical use of NUnit for unit testing where you test individual classes. This is similar to acceptance testing except that it is written by the developer to discern that the program does what they interpreted as being what the customer wants the program to do. I don't need it to be readable by non-programmers or to produce a readable specification for non-programmers.

The problem I am having is keeping this feature testing code maintainable. I need help in organizing my feature testing code. I also need help organizing the program code to be drivable in this way. I am having a hard time being able to issue commands to the program while still having good code design.

Currently I have a class called Program with a single public method called Run. With every test I start at the beginning of the program like the user would and then get to the desired point in the program where a particular feature would be available. I then use that feature in some way and verify it did what I want. I have a class called Commands that exposes different features of the program as methods. An instance of the Commands object is passed to the program and it eventually gets passed to every Form class. These will subscribe to events from the Commands class that are called by the methods of the command class(one matching event per method). The events are subscribed to by pointed to the method that is called when a certain part of the user interface is used, thus allowing the entire program to be drivable by my tests. If you call a method on the Command object for an event that is currently not subscribed to, a FeatureMissingException is thrown.

All of this works but I don't like the Command class. It is getting too large with too many responsibilities (every feature of the program). The Commands class is also a dependency magnet (all the Form classes have an instance of it but only subscribe to the events that represent features that can be activated through their UI).

+2  A: 

It's called integration testing. Integration tests are much more difficult to make automated, and are very often done by hand. Many simpler tests can still be done using NUnit though - you don't have to do anything special, just don't use Mocks (like you should be doing for unit tests) so you can test how the modules actually fit together.

Context/specification is a good way of organizing these tests.

BlueRaja - Danny Pflughoeft
Thanks for letting me know this is integration testing. I looked up integration testing before posting my question and I thought it was something else. Using inheritance to provide the context for a test sounds good in theory but when I have tried doing this in practice it has resulted in horribly confusing test code. Plus this still does not solve my main problem of how to issue commands to the system as a whole instead of individual classes while still keeping good design.
INTPnerd
+2  A: 

What you want to do is integration testing, like the other answer suggests. This will allows you to functional/feature testing. The most common framework for this for StoryQ or SpecFlow. This allows you to develop your tests in a BDD style and can be mostly be automated against the spec that you want.

Tools like Selenium allow you to do functional testing in a browser to do what the end user would do. All of these can be driven with NUnit since NUnit is purely a framework for running tests be them Unit tests to large functional tests

AutomatedTester
Thanks for the tool advice and for telling me the first answerer was right about this being integration testing. I have seen other tools similar to these but SpecFlow looks really easy to use. This still does not solve my main problem of how to make the program as a whole drivable instead of dealing with individual classes. I will add more detail to my question.
INTPnerd