什么是一些stream行的unit testing命名约定?

一般

  • 按照相同的标准进行所有testing。
  • 清楚每个testing状态是什么。
  • 具体说明预期的行为。

例子

1)MethodName_StateUnderTest_ExpectedBehavior

Public void Sum_NegativeNumberAs1stParam_ExceptionThrown() Public void Sum_NegativeNumberAs2ndParam_ExceptionThrown () Public void Sum_simpleValues_Calculated () 

来源: unit testing的命名标准

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 () 

其他

  • 使用Test结束方法名称
  • 用类名称启动方法名称

我和你在这个人上很相像。 您使用的命名约定是:

  • 清楚每个testing状态是什么。
  • 具体关于预期的行为。

你还需要从一个testing名字?

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

至于下划线的长度和用法,它的testing代码 ,谁在关心? 只有你和你的团队才会看到它,只要它是可读的,并且清楚testing正在做什么,继续! 🙂

这就是说,我还是相当新的testing和博客我的冒险 🙂

这也值得一读:组织unit testing

该结构有一个testing类每个类正在testing。 这并不奇怪。 但是对我而言,不同寻常的是,他为每个被testing的方法都有一个嵌套的类。

例如

 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 } } } 

这是为什么:

一件事,这是保持testing组织的一个好方法。 一个方法的所有testing(或事实)被分组在一起。 例如,如果使用CTRL + M,CTRL + O快捷键来折叠方法体,则可以轻松地扫描testing并像读取代码一样读取它们。

我也喜欢这个方法:

MethodName_StateUnderTest_ExpectedBehavior

所以也许调整到:

StateUnderTest_ExpectedBehavior

因为每个testing将已经在一个嵌套的类

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

 Sum_ThrowsException_WhenNegativeNumberAs1stParam 

但是,我所看到的很多是使testing名称遵循unit testing结构

  • 安排
  • 法案
  • 断言

其中也遵循BDD / Gherkin语法:

  • 特定
  • 什么时候
  • 然后

这将是以下列方式命名testing: UnderTheseTestConditions_WhenIDoThis_ThenIGetThis

所以以你为例:

 WhenNegativeNumberAs1stParam_Sum_ThrowsAnException 

不过我更喜欢把方法名称先testing一下,因为这样testing可以按字母顺序排列,或者在VisStudio的成员下拉框中按字母顺序排列,并且所有1方法的testing都被分组在一起。


无论如何,我喜欢将testing名称的主要部分与下划线分开,而不是每个单词 ,因为我认为这样可以更轻松地阅读并获得测​​试的重点。

换句话说,我喜欢: Sum_ThrowsException_WhenNegativeNumberAs1stParam优于Sum_Throws_Exception_When_Negative_Number_As_1st_Param

我会像使用“PascalCasing”而没有任何下划线或分隔符的其他方法来命名我的testing方法。 我离开后缀testing的方法了,因为它没有增加任何价值。 TestMethod属性表示该方法是testing方法。

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

由于每个Test类只应该testing另外一个类,所以我把这个类的名字留给了方法名。 包含testing方法的类的名字被命名为被testing的类,后缀为“Tests”。

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

对于testing不可能的exception或行为的方法,我在testing方法的前面添加Can not字样。

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

我的命名传达基于Bryan Cook的文章“TDD提示:testing命名约定和指南” 。 我发现这篇文章非常有帮助。

第一组名称对我来说更具可读性,因为CamelCasing将单词和下划线分隔开了命名scheme的各个部分。

我也倾向于将“testing”包含在函数名称或封装的名称空间或类中。

只要你遵循一个单一的做法,这并不重要。 通常,我为覆盖方法的所有变体(我有简单的方法;)编写一个unit testing,然后为需要的方法编写更复杂的testing集。 因此我的命名结构通常是testing(JUnit 3的延期)。

我为testing命名空间,类和方法使用了“T”前缀。

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

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

我可以很容易地看到有些东西是testing,我确切知道它的原始代码(如果你不能解决这个问题,那么testing过于复杂)。

它看起来就像接口命名约定(我的意思是,你不会混淆以'I'开始的事情,也不会'T')。

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

无论如何,这在理论上是好的,对于小项目来说效果还不错。