3、一次测试太多的项目
看看下面的单元测试,请在不使用“和”这个词的情况下描述它:
- [TestMethod]
- public void ProductPriceTests()
- {
-
- var product = new Product()
- {
- BasePrice = 10m
- };
-
-
- decimal basePrice = product.CalculatePrice(CalculationRules.None);
- decimal discountPrice = product.CalculatePrice(CalculationRules.Discounted);
- decimal standardPrice = product.CalculatePrice(CalculationRules.Standard);
-
-
- Assert.AreEqual(10m, basePrice);
- Assert.AreEqual(11m, discountPrice);
- Assert.AreEqual(12m, standardPrice);
- }
|
我只能这样描述这个方法:
“测试中计算基价,打折价和标准价是都能否返回正确的值。”
这是一个简单的方法来判断你是否一次测试了过多的内容。上面这个测试会有三种情况导致它失败。如果测试失败,我们需要去找到那个/哪些出了错。
理想情况下,每一个方法都应该有它自己的测试,例如:
- [TestMethod]
- public void CalculateDiscountedPriceReturnsAmountOf11()
- {
-
- var product = new Product()
- {
- BasePrice = 10m
- };
-
-
- decimal discountPrice = product.CalculatePrice(CalculationRules.Discounted);
-
-
- Assert.AreEqual(11m, discountPrice);
- }
-
- [TestMethod]
- public void CalculateStandardPriceReturnsAmountOf12()
- {
-
- var product = new Product()
- {
- BasePrice = 10m
- };
-
-
- decimal standardPrice = product.CalculatePrice(CalculationRules.Standard);
-
-
- Assert.AreEqual(12m, standardPrice);
- }
-
- [TestMethod]
- public void NoDiscountRuleReturnsBasePrice()
- {
-
- var product = new Product()
- {
- BasePrice = 10m
- };
-
-
- decimal basePrice = product.CalculatePrice(CalculationRules.None);
-
-
- Assert.AreEqual(10m, basePrice);
- }
|
注意这些非常具有描述性的测试名称。如果一个项目里有500个测试,其中一个失败了,你能根据名称就能知道哪个测试应该为此承担责任。
这样我们可能会有更多的方法,但换来的好处是清晰。我在《代码大全(第2版)》里看到了这句经验之谈:
为方法里的每个IF,And,Or,Case,For,While等条件写出独立的测试方法。