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