Unit testing 单元测试命名最佳实践
命名单元测试类和测试方法的最佳实践是什么? 在此之前,在 我不知道这是否是一个很好的方法,但目前在我的测试项目中,我在每个生产类和测试类之间有一对一的映射,例如Unit testing 单元测试命名最佳实践,unit-testing,naming-conventions,Unit Testing,Naming Conventions,命名单元测试类和测试方法的最佳实践是什么? 在此之前,在 我不知道这是否是一个很好的方法,但目前在我的测试项目中,我在每个生产类和测试类之间有一对一的映射,例如Product和ProductTest 在我的测试类中,我有一些方法,这些方法的名称是我正在测试的方法、下划线,然后是情况和我期望发生的事情,例如,Save\u shouldthroweExceptionWithNullName() 对于测试方法名称,我个人认为使用详细和自我记录的名称非常有用(与Javadoc注释一起,进一步解释测试正
Product
和ProductTest
在我的测试类中,我有一些方法,这些方法的名称是我正在测试的方法、下划线,然后是情况和我期望发生的事情,例如,Save\u shouldthroweExceptionWithNullName()
对于测试方法名称,我个人认为使用详细和自我记录的名称非常有用(与Javadoc注释一起,进一步解释测试正在做什么)。建议:
- 每个“单元”(程序类)一个测试夹具。测试夹具本身就是类。测试夹具名称应为:
[name of your 'unit']Tests
- 测试用例(测试夹具方法)的名称如下:
test[feature being tested]
例如,具有以下类别:
class Person {
int calculateAge() { ... }
// other methods and properties
}
测试夹具应为:
class PersonTests {
testAgeCalculationWithNoBirthDate() { ... }
// or
testCalculateAge() { ... }
}
我喜欢这种命名方式:
OrdersShouldBeCreated();
OrdersWithNoProductsShouldFail();
等等。
它让非测试人员清楚地知道问题所在。在VS+NUnit中,我通常在项目中创建文件夹,将功能测试分组在一起。然后我创建单元测试夹具类,并根据我正在测试的功能类型命名它们。[Test]方法的命名方式如下:可以将用户添加到域中
:
- MyUnitTestProject
+ FTPServerTests <- Folder
+ UserManagerTests <- Test Fixture Class
- Can_add_user_to_domain <- Test methods
- Can_delete_user_from_domain
- Can_reset_password
-MyUnitTestProject
+FTPServerTests我应该补充一点,将测试放在同一个包中,但与被测试的源代码放在一个并行目录中,这样就可以在准备部署代码时消除代码膨胀,而无需执行一系列排除模式
我个人喜欢……中描述的最佳实践。。。很难打败JUnit的合著者写的一本书 类Foo的测试用例的名称应该是FootTestCase或类似的名称(FooIntegrationTestCase或FooAcceptanceTestCase)——因为它是一个测试用例。请参阅,了解一些标准命名约定,如测试、测试用例、测试夹具、测试方法等。我最近提出了以下约定,用于命名我的测试、它们的类和包含项目,以最大限度地利用它们的描述:
假设我正在MyApp.Serialization
命名空间中的项目中测试设置
类
首先,我将使用MyApp.Serialization.Tests
名称空间创建一个测试项目
在这个项目中,当然还有名称空间中,我将创建一个名为IfSettings
(另存为IfSettings.cs)的类
假设我正在测试SaveStrings()
方法。->我将把测试命名为CanSaveStrings()
当我运行此测试时,它将显示以下标题:
MyApp.Serialization.Tests.IfSettings.CanSaveStrings
我想这很好地告诉了我,它在测试什么
当然,在英语中,名词“Tests”与动词“Tests”相同是有用的
在命名测试时,您的创造力是无限的,因此我们可以为它们提供完整的句子标题
通常,测试名称必须以动词开头
例子包括:
- 检测(例如,
检测ValidUserInput
)
- 抛出(例如,ThrowsOnNotFound
)
将(例如,将在交易后关闭数据库
)
等等
另一种选择是使用“that”而不是“if”
不过,后者可以节省我的击键次数,并更准确地描述我正在做的事情,因为我不知道被测试的行为是否存在,但如果存在,我会进行测试
[编辑]
在使用上述命名约定一段时间后,我发现,在处理接口时,If前缀可能会令人困惑。碰巧的是,测试类IfSerializer.cs看起来与“Open Files Tab”中的接口ISerializer.cs非常相似。
当在测试、被测试的类及其接口之间来回切换时,这会变得非常烦人。因此,我现在选择That而不是If作为前缀
此外,我现在仅对测试类中的方法使用“\u1”分隔测试方法名称中的单词,因为这在其他任何地方都不被视为最佳实践,如下所示:
[Test] public void detects_invalid_User_Input()
我觉得这更容易阅读
[结束编辑]
我希望这能产生更多的想法,因为我认为命名测试是非常重要的,因为它可以节省大量的时间,而这些时间本来是用来理解测试所做的(例如,在一个扩展中断之后重新启动一个项目)。 < P> <强>类名< /强>。对于测试夹具名称,我发现“test”在许多领域的通用语言中非常常见。例如,在工程领域:压力测试
,在化妆品领域:皮肤测试
。很抱歉不同意Kent的观点,但是在我的测试装置中使用“Test”(StressTestTest
?)会让人困惑
“单位”在域中也被大量使用。例如,measurementit
。名为MeasurementUnitTest
的类是“Measurement”还是“MeasurementUnit”的测试
因此,我喜欢在所有测试类中使用“Qa”前缀。例如QaSkinTest
和qasurementUnit
。它永远不会与域对象混淆,使用前缀而不是后缀意味着所有的测试装置在视觉上都在一起(如果您的测试项目中有赝品或其他支持类,那么这很有用)
名称空间。我在C#中工作,我将我的测试类与它们正在测试的类保持在同一名称空间中。它比使用单独的测试名称空间更方便。当然,测试类在另一个项目中
测试方法名称。我
WhenDivisorIsNonZero_ExpectDivisionResult
WhenDivisorIsZero_ExpectError
WhenInventoryIsBelowOrderQty_ExpectBackOrder
WhenInventoryIsAboveOrderQty_ExpectReducedInventory