编写定价方法的测试
本文关键字:测试 方法 | 更新日期: 2023-09-27 18:19:45
我是单元测试/TDD的新手,在了解它的某些方面时遇到了问题。例如,我不确定测试应该有多完整,想象一下下面的场景。
我正在写一个测试,以确保我得到正确的产品价格。一种产品可以有不同的尺寸,也可以按一定数量购买。产品的价格将反映产品的大小和数量。
例如:
产品A的定价矩阵如下(数量在侧面,尺寸在顶部)
----------------------------
| | xs | s | m | l |
----------------------------
| 250| 10 | 20 | 50 | 100 |
----------------------------
| 500| 20 | 40 | 60 | 110 |
----------------------------
| 1000| 15 | 25 | 55 | 105 |
----------------------------
| 1500| 12 | 22 | 52 | 102 |
----------------------------
现在假设我正在为类方法编写测试
Pricer.GetPrice(Product p, string size, int quantity)
我应该测试每种产品/尺寸/数量的组合吗?可以想象,这可能意味着要进行大量的测试。
如果价格来源于数据存储,因此可能会发生变化,你如何保持测试的正确性,或者这只是一个烦人的副产品?
还有没有人有任何关于写作测试/TDD的好链接可以阅读。也许是通过CRUD/存储库,因为这看起来有点像鸡和蛋类型的场景。
听起来定价逻辑有两个元素。
-
价格矩阵数据结构映射(大小、数量截止)对到价格。
-
一个函数,它获取一个价格矩阵和一个
Product
实例并返回一个价格。
测试价格矩阵毫无意义;这些数字是任意的。如果你觉得你需要测试这个函数,我会用不同的模拟产品传递不同的伪造的、硬编码的测试矩阵,并进行测试以验证价格是否合适。最相关的边缘情况可能是当你要求一个确切的截止数量的价格或一比一的价格时。
单元测试是测试尽可能小的代码单元,所以在这种情况下,您只关心该方法返回预期的价格。如果该方法是从外部获取定价数据,那么它需要做两件事:获取定价数据和计算价格。您发现了违反SRP的行为。
将其分为两种方法:一种是获取定价数据,另一种是计算价格(使用作为参数传递的定价数据)。
所以你的目标方法现在看起来像:
GetPrice(Product p, string size, int quantity, sometype pricingData)
现在您可以单独测试计算:
var pricingData = GetKnownPricingData(); // get a set of dummy pricing data
var result = Pricer.GetPrice(product, size, quantity, pricingData);
然后,您可以根据已知的定价数据检查预期结果。
我认为您的测试需要是特定的,并且在开始编写测试之前,您需要确定要测试什么。
考虑加两个数字?你不必测试每一个给定的2个数字的组合。您编写一个测试,给它2个数字,并检查返回的值是否确实是这些数字的总和。
您询问了有关测试每个尺寸/数量组合的问题。如果没有定义的计算来确定这一点,并且您有用于计算的变量值,那么您就无法真正测试这一点。
你可以测试一下:X的大小和Y的数量应该给出Z的价格。插入X和Y的值,确保你得到Z的预期值。
如果X或Y没有值怎么办?你失败了吗?是否返回0?这些东西你可以测试。
在现实生活中,您通常会存根数据库,因此它将返回know对象,而不依赖于存储。如果你使用例如NUnit框架进行测试,你也可以用TestCaseAttribute
来装饰你的测试,以运行具有许多不同参数和返回值的测试。