1

我有一个FileExtractor类,它有一个Start执行一些步骤的方法。

我在名为“FileExtractorTests”的文件夹中创建了一个名为“WhenExtractingInvalidFile.cs”的测试类,并在其中添加了一些测试方法,如下所示,应作为 Start() 方法的步骤进行验证:

[TestMethod]
public void Should_remove_original_file()
{

}

[TestMethod]
public void Should_add_original_file_to_errorStorage()
{

}

[TestMethod]
public void Should_log_error_locally()
{

}

这样,它可以很好地组织应该满足的行为和期望。

问题是这些测试方法的大部分逻辑都是相同的,所以我应该创建一种测试方法来验证所有步骤还是像上面一样单独创建?

[TestMethod]
public void Should_remove_original_file_then_add_original_file_to_errorStorage_then_log_error_locally()
{      
}

最佳做法是什么?

4

3 回答 3

2

虽然人们普遍认为测试的Act部分应该只包含一个调用,但对于“每个测试一个断言”的做法仍然存在很多争论。

我倾向于坚持它,因为:

  • 当测试失败时,我立即(从测试名称)知道我们要在被测方法上验证的多项内容中的哪一项出错了。

  • 暗示模拟的测试已经比常规测试更难阅读,当您在同一个测试中断言多个模拟时,它们很容易变得晦涩难懂。

如果您不遵循它,我至少建议您包含有意义的 Assert 消息,以便在测试失败时尽量减少头疼。

于 2013-04-09T12:30:13.080 回答
0

干燥 - 不要重复自己。

想想你的测试失败的场景。从测试组织的角度来看,什么最有用?

要看的第二个维度是维护。您要运行和维护 1 个测试还是 n 个测试?不要因为编写许多没有什么价值的测试而使开发负担过重(我认为出于这个原因,TDD 有点被高估了)。如果一个测试使用更大的代码路径而不是较短的路径,那么它会更有价值。

在这个特定场景中,我将创建一个测试。如果此测试经常失败并且您没有足够快地找到问题的根本原因,请重新考虑多个测试。

于 2013-04-09T11:54:10.523 回答
0

我会做和你一样的事情,但是_on_start后缀是这样的:Should_remove_original_file_on_start. 后一种方法最多只会给你一个断言失败,即使 Start 的所有方面都可能被破坏。

于 2013-04-09T09:15:49.547 回答