Osherove的负面单元测试命名约定?

The*_*irl 4 c# refactoring unit-testing naming-conventions

我正在尝试确定单元测试的命名约定.我喜欢Roy Osherove推荐的那款:

[MethodName_StateUnderTest_ExpectedBehavior]

http://osherove.com/blog/2005/4/3/naming-standards-for-unit-tests.html

我不确定这个负面测试的标准,我们正在测试应用程序是否通过抛出异常正确处理错误的行为.

所以ExpectedBehavior在这种情况下总是"CorrectExceptionThrown".为每个负面单元测试编写ExpectedBehavior仍然有意义还是可以使它成为可选项?

有利有弊.一方面,对于否定测试,它总是相同的,因此每次写入它都是多余的,它使单元测试方法名称变长.如果我们将其作为可选项,那么在必要时也不会为单元测试添加预期行为的风险.我也认为最好在整个项目中保持一致,所以在任何地方都应用相同的方式.

k.m*_*k.m 5

在指定作为操作结果抛出的异常时,没有什么是多余的.这实际上完全符合Roy的命名惯例,给出:

SomeMethod_ExpectionalState_ThrowsInvalidOperationException
SomeMethod_ExceptionalState_ThrowsArgumentNullException
Run Code Online (Sandbox Code Playgroud)

您将获得有关代码的重要信息 - 抛出的异常类型.但是,当你有经典的幸福路径测试时,某些部分名称的有用性是主观的.考虑:

SomeMethod_DependencyReturnsCorrectResult_ReturnsResult
SomeMethod_WhenNothingSpecialHappens_ReturnsResult
SomeMethod_EverythingElseWorked_WorksToo
Run Code Online (Sandbox Code Playgroud)

这些名字带有哪些信息?相当少.ReturnsResult本质上意味着它有效.NothingSpecialHappens也是相当模糊的信息.在这种情况下,删除部分名称可能是合理的.

但请注意,相反,可能值得考虑更改名称而不是完全删除其中的一部分(例如,ReturnsResult可以用较不模糊ReturnsEntityFromDatabase或替换ReturnsSerializedValue).

最后,不要盲目跟随罗伊 - 将其视为指导方针,而不是惯例.公约很少适用于所有可能的情况,这一点也不例外.