我正在尝试提高项目中单元测试的性能。如果我用一种逻辑编写测试,则需要在测试中编写另一种逻辑。我像这样重现它: 我有类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");
}
然后通过测试。有没有设置产品信息的任何方法(无需更改逻辑)?我希望我能理解用例。
答案 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");
}
}