I currently use a simple convention for my unit tests. If I have a class named “EmployeeReader”, I create a test class named “EmployeeReader.Tests. I then create all the tests for the class in the test class with names such as:
- Reading_Valid_Employee_Data_Correctly_Generates_Employee_Object
- Reading_Missing_Employee_Data_Throws_Invalid_Employee_ID_Exception
and so on.
I have recently been reading about a different type of naming convention used in BDD. I like the readability of this naming, to end up with a list of tests something like:
- When_Reading_Valid_Employee (fixture)
- Employee_Object_Is_Generated (method)
- Employee_Has_Correct_ID (method)
- When_Reading_Missing_Employee (fixture)
- An_Invalid_Employee_ID_Exception_Is_Thrown (method)
and so on.
Has anybody used both styles of naming? Can you provide any advice, benefits, drawbacks, gotchas, etc. to help me decide whether to switch or not for my next project?
Your second example (having a fixture for each logical “task”, rather than one for each class) has the advantage that you can have different SetUp and TearDown logic for each task, thus simplifying your individual test methods and making them more readable.
You don’t need to settle on one or the other as a standard. We use a mixture of both, depending on how many different “tasks” we have to test for each class.