如何排除其他逻辑并提高单元测试的性能

时间:2019-01-12 04:37:52

标签: c# unit-testing

我正在尝试提高项目中单元测试的性能。如果我用一种逻辑编写测试,则需要在测试中编写另一种逻辑。我像这样重现它: 我有类ProductInfo

    public class ProductInfo
{
    public string Name { get; set; }
    public string Title { get; set; }
}

和产品类别:

 public class Product
{
    public ProductInfo Info { get; set; }

    private decimal price;
    public decimal Price
    {
        get
        {
            return price;
        }
        set
        {
            price = value;
            Info.Title = $"{Info.Name}-{price} USD";
        }
    }
}

我创建用于设置价格的单元测试

[TestMethod]
    public void ProductInfoTitleTest()
    {
        decimal price = 120;
        string productName = "Product1";
        ProductInfo info = new ProductInfo() { Name = productName };
        Product product = new Product() { Info = info };
        product.Price = price;
        Assert.AreEqual($"{productName}-{price} USD", product.Info.Title, "Both should be equal");
    }

已创建测试合格。因此,我在Product类中创建了另一个属性:

public int Quantity { get; set; }

    public decimal TotalPrice
    {
        get
        {
            return Price * Quantity;
        }
    }

然后我创建用于测试TotalPrice的测试:

    [TestMethod]
    public void ProductTotalPriceTest()
    {
        Product product = new Product
        {
            Price = 100,
            Quantity = 2
        };
        Assert.AreEqual(200, product.TotalPrice, "It should be 200");
    }

该测试失败,因为我没有设置产品信息。所以,我这样做:

 [TestMethod]
    public void ProductTotalPriceTest()
    {
        Product product = new Product
        {
            Info = new ProductInfo(),
            Price = 100,
            Quantity = 2
        };
        Assert.AreEqual(200, product.TotalPrice, "It should be 200");
    }

然后通过测试。有没有设置产品信息的任何方法(无需更改逻辑)?我希望我能理解用例。

2 个答案:

答案 0 :(得分:1)

  

如何排除其他逻辑

您不应该lowest = min(d.items(), key=lambda x: x[1]) print(lowest) # (2, 40) 的有效实例是ProductInfo类的“合同”的一部分。

我什至建议使用构造函数的Product参数来明确显示该类的使用者,如果没有该类,该类将无法正常工作。

如果要测试的类的配置变得复杂,请创建帮助程序/构建器类/函数,其中配置逻辑将保留在同一位置。

例如:

ProductInfo

然后在测试中,您将能够创建类型为public class ProductBuilder { private string _productName; private decimal _price; private int _quantity; public ProductBuilder ProductName(string name) { _productName = name; return this; } public ProductBuilder Price(decimal price) { _price = price; return this; } public ProductBuilder Quantity(int quantity) { _quantity = quantity; return this; } public Product Create() { return new Product { Info = new ProductInfo { Name = _productName }, Price = _price, Quantity = _price, } } } 的有效实例。

Product

通过将配置封装到专用的类中,您将能够更改配置逻辑,而无需进行每项测试。除非,您当然要更改班级的公共合同。

答案 1 :(得分:0)

这似乎是一个很好的机会,可以在每次测试之前使用测试初始化​​程序以Product实例化ProductInfo,然后根据需要对其进行修改。

[TestClass]
public class ProductTests
{
    Product product;

    [TestInitialize]
    public void Setup()
    {
        product = new Product { Info = new ProductInfo() };
    }

    [TestMethod]
    public void ProductInfoTitleTest()
    {
        decimal price = 120;
        string productName = "Product1";
        product.Info.Name = productName;
        product.Price = price;
        Assert.AreEqual($"{productName}-{price} USD", product.Info.Title, "Both should be equal");
    }

    [TestMethod]
    public void ProductTotalPriceTest()
    {
        product.Price = 100;
        product.Quantity = 2;
        Assert.AreEqual(200, product.TotalPrice, "It should be 200");
    }
}