.net 每个单元测试的多重安排/断言?

.net 每个单元测试的多重安排/断言?,.net,unit-testing,assert,.net,Unit Testing,Assert,一群美国.NET开发人员正在讨论单元测试。我们在MSpec、NUint、MSTest、Rhinomock、TypeMock等方面没有遇到任何一个框架,我们只是泛泛地讨论 我们看到很多语法强制每个场景进行不同的单元测试,但我们没有看到一种方法可以对各种输入或场景重新使用一个单元测试。此外,我们看不到一个给定测试中有多个断言的途径,而早期断言的失败不会威胁到同一测试中后续断言的测试 在基于状态或行为的.NET单元测试中,有没有发生过类似的情况?您可以做的一个解决方案是将场景放入设置函数中 在NUni

一群美国.NET开发人员正在讨论单元测试。我们在MSpec、NUint、MSTest、Rhinomock、TypeMock等方面没有遇到任何一个框架,我们只是泛泛地讨论


我们看到很多语法强制每个场景进行不同的单元测试,但我们没有看到一种方法可以对各种输入或场景重新使用一个单元测试。此外,我们看不到一个给定测试中有多个断言的途径,而早期断言的失败不会威胁到同一测试中后续断言的测试


在基于状态或行为的.NET单元测试中,有没有发生过类似的情况?

您可以做的一个解决方案是将场景放入设置函数中

在NUnit中,您可以使用如下方法:

私人一类c1

[SetUp()]
private void Setup()
{
c1 = new class1{Prop1 = 'A', Prop2= 'B'};
}
然后进行两项测试:

[Test()]
private void Property1_Is_A
{
   Assert.AreEqual('A', c1.Prop1);
}

[Test()]
private void Property2_Is_B
{
   Assert.AreEqual('B', c1.Prop2);
}
每次执行测试之前都会调用安装程序。我想你可以用一个构造函数做类似的事情,这个构造函数会被调用一次


也就是说,有一些很好的理由反对这一点,因为一个单独的测试应该设置它所需要的一切。但这些并不是硬性规定。

您可以做的一个解决方案是将场景放入设置函数中

在NUnit中,您可以使用如下方法:

私人一类c1

[SetUp()]
private void Setup()
{
c1 = new class1{Prop1 = 'A', Prop2= 'B'};
}
然后进行两项测试:

[Test()]
private void Property1_Is_A
{
   Assert.AreEqual('A', c1.Prop1);
}

[Test()]
private void Property2_Is_B
{
   Assert.AreEqual('B', c1.Prop2);
}
每次执行测试之前都会调用安装程序。我想你可以用一个构造函数做类似的事情,这个构造函数会被调用一次

也就是说,有一些很好的理由反对这一点,因为一个单独的测试应该设置它所需要的一切。但这些并不是硬性规定

我们看不到一种途径可以对各种输入或场景重新使用一个单元测试

标准的setup/teardown方法已经在很大程度上帮助重用测试代码。除此之外,我相信许多.Net单元测试框架实现了与Java对应的JUnit和TestNG相同或相似的功能,后者支持参数化测试

此外,我们看不到一个给定测试中有多个断言的途径,而早期断言的失败不会威胁到同一测试中后续断言的测试

在我的解释中,测试方法测试单个用例。如果断言失败,测试就会失败,并且有很好的理由尽快修复它。单元测试的正常状态应该是100%成功,在这种情况下,所有测试中的所有断言都通过。换句话说,考试不及格应该是例外而不是常态;我不太担心特殊情况。如果它仍然让您担心,您可以总是安排您的测试方法只包含一个断言

我们看不到一种途径可以对各种输入或场景重新使用一个单元测试

标准的setup/teardown方法已经在很大程度上帮助重用测试代码。除此之外,我相信许多.Net单元测试框架实现了与Java对应的JUnit和TestNG相同或相似的功能,后者支持参数化测试

此外,我们看不到一个给定测试中有多个断言的途径,而早期断言的失败不会威胁到同一测试中后续断言的测试

在我的解释中,测试方法测试单个用例。如果断言失败,测试就会失败,并且有很好的理由尽快修复它。单元测试的正常状态应该是100%成功,在这种情况下,所有测试中的所有断言都通过。换句话说,考试不及格应该是例外而不是常态;我不太担心特殊情况。如果它仍然让您担心,您可以总是安排您的测试方法只包含一个断言


我们看到很多语法强制每个场景进行不同的单元测试,但我们没有看到一种方法可以对各种输入或场景重新使用一个单元测试

在MBUnit中使用RowTest或在xUnit.net中使用理论来改变输入变量是很常见的。谷歌其中任何一个,你会发现几个例子。Ben Hall在xUnit.net上发表了一篇关于使用理论的文章:

此外,我们看不到在一个给定的测试中,如果早期断言的失败不威胁到后续断言的测试,那么就有多个断言的途径

在一个测试中有多个断言是很好而且常见的。这里需要遵循的概念是,单个单元测试应该测试特定的行为或单个代码单元。如果在一个单元测试中有3个断言,而第一个失败,那么此时其他2个是否通过并不重要,大多数测试运行者不会在一个失败后在单个测试中运行其余的断言,重要的是一个失败的断言

对于每个测试是否应该测试多个行为/代码单元,有很多意见。出于许多原因,我更喜欢每次测试一种行为。最重要的一点是,当其中一个测试失败时,我或其他人必须返回并阅读测试以查看 到底什么是失败的,为什么是失败的。如果我们必须通读一个不仅仅是测试单个行为的单元测试,那么我们就是在浪费时间。当在较小的块中进行测试时,确保为代码编写正确的测试也容易得多。我强烈建议你买一份罗伊·奥瑟洛夫的T


我们看到很多语法强制每个场景进行不同的单元测试,但我们没有看到一种方法可以对各种输入或场景重新使用一个单元测试

在MBUnit中使用RowTest或在xUnit.net中使用理论来改变输入变量是很常见的。谷歌其中任何一个,你会发现几个例子。Ben Hall在xUnit.net上发表了一篇关于使用理论的文章:

此外,我们看不到在一个给定的测试中,如果早期断言的失败不威胁到后续断言的测试,那么就有多个断言的途径

在一个测试中有多个断言是很好而且常见的。这里需要遵循的概念是,单个单元测试应该测试特定的行为或单个代码单元。如果在一个单元测试中有3个断言,而第一个失败,那么此时其他2个是否通过并不重要,大多数测试运行者不会在一个失败后在单个测试中运行其余的断言,重要的是一个失败的断言


对于每个测试是否应该测试多个行为/代码单元,有很多意见。出于许多原因,我更喜欢每次测试一种行为。最重要的一点是,当其中一个测试失败时,我或其他人将不得不返回并阅读测试,以准确了解失败的原因和原因。如果我们必须通读一个不仅仅是测试单个行为的单元测试,那么我们就是在浪费时间。当在较小的块中进行测试时,确保为代码编写正确的测试也容易得多。我强烈建议您获得一份Roy Osherove的T.

看看NUnit中的[TestCaseparams] 允许使用不同的输入执行相同的测试

另外,对于多重资产的事情, 请看OAPT每个测试运行程序一个断言-它承诺使用多个断言进行测试,并将每个断言作为自己的测试运行:
查看NUnit中的[TestCaseparams] 允许使用不同的输入执行相同的测试

另外,对于多重资产的事情, 请看OAPT每个测试运行程序一个断言-它承诺使用多个断言进行测试,并将每个断言作为自己的测试运行:

但我们看不到一种途径可以对各种输入或场景重新使用一个单元测试,测试用例不是一个类吗?你不能把它们分类吗?我不明白这个问题。你能提供一个你被阻止做什么的例子吗?re:你的报价,我们想知道我们是否可以有一个输入列表,所有输入都可以通过一个测试进行测试。我刚刚在谷歌上搜索了NUnit的RowTest扩展,不知道MSTest、MSpec等是否有类似的扩展,它们看起来只使用值类型。我很想在更复杂的类型中看到类似的东西,但我不知道从语法/etc的角度来看它会是什么样子。@lance:什么?测试用例是一个类。您可以将其子类化以重用代码。为什么不简单地将测试用例子类化以重用代码?子类化TestCase与值类型和更复杂的类型有什么关系?请查看SumTest。这是一个测试,根据您提供的输入次数执行多次。作为一名开发人员,我对我刚刚发现的使用这种方法的经验并不感到兴奋,但它/正在/重新使用一个单元测试和各种输入。@lance:为什么不创建测试用例的子类?但是我们看不到重新使用一个单元测试和各种输入的途径,或者说测试用例不是一个类吗?你不能把它们分类吗?我不明白这个问题。你能提供一个你被阻止做什么的例子吗?re:你的报价,我们想知道我们是否可以有一个输入列表,所有输入都可以通过一个测试进行测试。我刚刚在谷歌上搜索了NUnit的RowTest扩展,不知道MSTest、MSpec等是否有类似的扩展,它们看起来只使用值类型。我很想在更复杂的类型中看到类似的东西,但我不知道从语法/etc的角度来看它会是什么样子。@lance:什么?测试用例是一个类。您可以将其子类化以重用代码。为什么不简单地将测试用例子类化以重用代码?子类化TestCase与值类型和更复杂的类型有什么关系?请查看SumTest。这是一个测试,根据您提供的输入次数执行多次。作为一名开发人员,我对我刚刚发现的使用这种方法的经验并不感到兴奋,但它/正在/重新使用一个单元测试和各种输入。@lance:为什么不创建测试用例的子类?我知道这是很久以前的事了,但上面的链接是一个死链接
,谢谢我知道这是很久以前的事了,但是上面的链接是死链接,罗伊,谢谢