我正在研究一些测试用例,我经常发现在每种情况下我都会遇到多个断言。例如(为简洁而过度简化和删除评论):
[Test]
public void TestNamePropertyCorrectlySetOnInstantiation()
{
MyClass myInstance = new MyClass("Test name");
Assert.AreEqual("Test Name", myInstance.Name);
}
这看起来原则上是可以接受的,但测试的目的是验证当使用给定名称实例化类时,Name属性设置正确,但如果在实例化时出现任何问题,它甚至会失败得到断言。
我重构了这样:
[Test]
public void TestNamePropertyCorrectlySetOnInstantiation()
{
MyClass myInstance;
string namePropertyValue;
Assert.DoesNotThrow(() => myInstance = new MyClass("Test name"));
Assert.DoesNotThrow(() => namePropertyValue = myInstance.Name);
Assert.AreEqual("Test Name", namePropertyValue);
}
但当然,现在我实际上在这里测试了三件事;在此测试中,我对测试MyClass实例是否已成功实例化,或者是否已成功读取Name属性感兴趣,这些在另一种情况下进行了测试。但是,如果前两个失败,我怎么能在没有断言其他两个断言的情况下测试最后一个断言,因为如果前两个失败,它甚至不可能进行测试?
答案 0 :(得分:12)
如果以无效的方式初始化它,只需要进行其他测试以检查是否 被抛出。第一种形式就是这样,IMO。
就个人而言,我会避免陷入“每次测试一个断言”的教条。尝试通过代码测试一条逻辑路径,以达到实际意义上的精细粒度。
答案 1 :(得分:1)
答案 2 :(得分:0)
答案 3 :(得分:0)