一般的

  • 所有测试均遵循相同的标准。
  • 清楚每个测试状态是什么。
  • 具体说明预期的行为。

例子

1) MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() 

Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () 

Public void Sum_simpleValues_Calculated ()

来源: 单元测试的命名标准

2)用下划线分隔每个单词

Public void Sum_Negative_Number_As_1st_Param_Exception_Thrown() 

Public void Sum_Negative_Number_As_2nd_Param_Exception_Thrown () 

Public void Sum_Simple_Values_Calculated ()

其他

  • 方法名称结尾为 测试
  • 方法名以类名开头
有帮助吗?

解决方案

我非常同意你对这个人的看法。您使用的命名约定是:

  • 清楚每个测试状态是什么。
  • 具体说明预期的行为。

您还需要测试名称做什么?

与之相反 雷的回答 我不认为 测试 前缀是必要的。这是测试代码,我们知道。如果你需要这样做来识别代码,那么你就会遇到更大的问题, 您的测试代码不应与生产代码混淆。

至于下划线的长度和使用,它 测试代码, ,谁在乎呢?只有您和您的团队会看到它,只要它可读,并且清楚测试在做什么,就继续吧!:)

也就是说,我对测试仍然很陌生 用它写博客我的冒险经历 :)

其他提示

这也值得一读: 构建单元测试

该结构每个被测试的类都有一个测试类。这并不罕见。但对我来说不同寻常的是,他为每个被测试的方法都有一个嵌套类。

例如

using Xunit;

public class TitleizerFacts
{
    public class TheTitleizerMethod
    {
        [Fact]
        public void NullName_ReturnsDefaultTitle()
        {
            // Test code
        }

        [Fact]
        public void Name_AppendsTitle()
        {
            // Test code
        }
    }

    public class TheKnightifyMethod
    {
        [Fact]
        public void NullName_ReturnsDefaultTitle()
        {
            // Test code
        }

        [Fact]
        public void MaleNames_AppendsSir()
        {
            // Test code
        }

        [Fact]
        public void FemaleNames_AppendsDame()
        {
            // Test code
        }
    }
}

原因如下:

一方面,这是保持测试井井有条的好方法。将方法的所有测试(或事实)分组在一起。例如,如果您使用CTRL+M,Ctrl+O快捷方式折叠方法物体,则可以轻松扫描测试并像代码的规格一样读取它们。

我也喜欢这种方法:

MethodName_StateUnderTest_ExpectedBehavior

所以也许调整为:

StateUnderTest_ExpectedBehavior

因为每个测试都已经在嵌套类中

我倾向于使用约定 MethodName_DoesWhat_WhenTheseConditions 例如:

Sum_ThrowsException_WhenNegativeNumberAs1stParam

然而,我经常看到的是让测试名称遵循单元测试结构

  • 安排
  • 行为
  • 断言

它还遵循 BDD / Gherkin 语法:

  • 给定
  • 什么时候
  • 然后

这将以以下方式命名测试: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

所以对于你的例子:

WhenNegativeNumberAs1stParam_Sum_ThrowsAnException

不过,我确实更喜欢将要测试的方法名称放在第一位,因为这样测试就可以按字母顺序排列,或者在 VisStudio 的成员下拉框中按字母顺序排列,并且 1 种方法的所有测试都分组在一起。


无论如何,我喜欢将专业分开 部分 带有下划线的测试名称,而不是每个 单词, ,因为我认为这样更容易阅读并理解测试的要点。

换句话说,我喜欢: Sum_ThrowsException_WhenNegativeNumberAs1stParamSum_Throws_Exception_When_Negative_Number_As_1st_Param.

我确实像使用“PascalCasing”的其他方法一样命名我的测试方法,没有任何下划线或分隔符。我留下后缀 测试 对于 out 方法,因为它没有增加任何价值。该方法是测试方法由属性指示 测试方法.

[TestMethod]
public void CanCountAllItems() {
  // Test the total count of items in collection.
}

由于每个测试类只能测试另一个类,因此我将类的名称保留在方法名称之外。包含测试方法的类的名称类似于被测试的类,带有后缀“Tests”。

[TestClass]
public class SuperCollectionTests(){
    // Any test methods that test the class SuperCollection
}

对于测试异常或不可能的操作的方法,我在测试方法前加上单词 不能.

[TestMethod]
[ExpectedException(typeOf(ArgumentException))]
public void CannotAddSameObjectAgain() {
  // Cannot add the same object again to the collection.
}

我的命名约定基于文章 “TDD 提示:测试命名约定和指南” 布莱恩·库克。我发现这篇文章非常有帮助。

第一组名称对我来说更易读,因为驼峰式分隔单词,下划线分隔命名方案的各个部分。

我还倾向于在某个地方包含“Test”,无论是在函数名称中还是在封闭的命名空间或类中。

只要你遵循单一的练习,这并不重要。一般来说,我为一个方法编写一个单元测试,该测试涵盖了一个方法的所有变体(我有简单的方法;),然后为需要它的方法编写更复杂的测试集。因此,我的命名结构通常是测试的(JUnit 3 的保留)。

我对测试命名空间、类和方法使用“T”前缀。

我尝试简洁地创建复制命名空间的文件夹,然后为测试创建一个测试文件夹或单独的项目,并为基本测试复制生产结构:

AProj
   Objects
      AnObj
         AProp
   Misc
      Functions
         AFunc
   Tests
      TObjects
         TAnObj
            TAnObjsAreEqualUnderCondition
      TMisc
         TFunctions
            TFuncBehavesUnderCondition

我可以很容易地看出某件事是一个测试,我确切地知道它属于什么原始代码(如果你不能解决这个问题,那么无论如何测试都太复杂了)。

它看起来就像接口命名约定(我的意思是,您不会与以“I”开头的事物混淆,也不会与“T”开头的事物混淆)。

无论是否进行测试,编译都很容易。

无论如何,它在理论上是很好的,并且对于小型项目来说效果很好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top