3、一次测试太多的项目

  看看下面的单元测试,请在不使用“和”这个词的情况下描述它:

    [TestMethod] 
    public void ProductPriceTests() 
    { 
        // Arrange 
        var product = new Product() 
        { 
            BasePrice = 10m 
        }; 
        
        // Act 
        decimal basePrice = product.CalculatePrice(CalculationRules.None); 
        decimal discountPrice = product.CalculatePrice(CalculationRules.Discounted); 
        decimal standardPrice = product.CalculatePrice(CalculationRules.Standard); 
        
        // Assert 
        Assert.AreEqual(10m, basePrice); 
        Assert.AreEqual(11m, discountPrice); 
        Assert.AreEqual(12m, standardPrice); 
    }

  我只能这样描述这个方法:

  “测试中计算基价,打折价和标准价是都能否返回正确的值。”

  这是一个简单的方法来判断你是否一次测试了过多的内容。上面这个测试会有三种情况导致它失败。如果测试失败,我们需要去找到那个/哪些出了错。

  理想情况下,每一个方法都应该有它自己的测试,例如:

    [TestMethod] 
    public void CalculateDiscountedPriceReturnsAmountOf11() 
    { 
        // Arrange 
        var product = new Product() 
        { 
            BasePrice = 10m 
        }; 
        
        // Act 
        decimal discountPrice = product.CalculatePrice(CalculationRules.Discounted); 
        
        // Assert 
        Assert.AreEqual(11m, discountPrice); 
    } 
        
    [TestMethod] 
    public void CalculateStandardPriceReturnsAmountOf12() 
    { 
        // Arrange 
        var product = new Product() 
        { 
            BasePrice = 10m 
        }; 
        
        // Act 
        decimal standardPrice = product.CalculatePrice(CalculationRules.Standard); 
        
        // Assert 
        Assert.AreEqual(12m, standardPrice); 
    } 
        
    [TestMethod] 
    public void NoDiscountRuleReturnsBasePrice() 
    { 
        // Arrange 
        var product = new Product() 
        { 
            BasePrice = 10m 
        }; 
        
        // Act 
        decimal basePrice = product.CalculatePrice(CalculationRules.None); 
        
        // Assert 
        Assert.AreEqual(10m, basePrice); 
    }

  注意这些非常具有描述性的测试名称。如果一个项目里有500个测试,其中一个失败了,你能根据名称能知道哪个测试应该为此承担责任。

  这样我们可能会有更多的方法,但换来的好处是清晰。我在《代码大全(第2版)》里看到了这句经验之谈:

  为方法里的每个IF,And,Or,Case,For,While等条件写出独立的测试方法。