编写定价方法的测试

时间:2012-01-05 20:55:24

标签: c# unit-testing tdd

我是单元测试/ 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 / Repositories,因为这似乎有点鸡和鸡蛋类型的情况。

4 个答案:

答案 0 :(得分:3)

听起来你的定价逻辑有两个要素。

  1. 价格矩阵数据结构映射(大小,数量截止)与价格成对。

  2. 一个采用价格矩阵和Product实例并返回价格的函数。

  3. 测试价格矩阵毫无意义;数字是任意的。如果您觉得需要测试该功能,我会通过不同的假冒硬编码测试矩阵传递不同的模拟产品并进行测试,以验证价格合适。最相关的边缘情况可能是您要求一个截止数量的确切价格或一个一个地的价格。

答案 1 :(得分:1)

单元测试是关于测试尽可能小的代码单元,所以在这种情况下,您关心的是该方法返回预期的价格。如果该方法从外部获取定价数据,那么它正在做两件事:获取定价数据和计算价格。您已发现违反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 :(得分:1)

我认为您的测试需要具体,您需要在开始编写测试之前确定您正在测试的内容。

考虑添加两个数字?您不必测试要添加的2个数字的每个给定组合。你编写一个测试并给它2个数字并检查返回的值是否确实是这些数字的总和。

您询问了测试每种尺寸/数量组合的问题。如果没有用于确定此计算的已定义计算,并且您具有用于计算的变量值,则无法对此进行真正的测试。

你可以测试一下:X的大小和Y的数量应该给出Z的价格。插入X和Y的值,并确保你得到Z的预期值。

如果X或Y没有值怎么办?你失败了吗?返回0?这些东西你可以测试。

答案 3 :(得分:0)

在现实生活中,您通常会将数据库存根,因此它将返回已知对象,而与存储无关。如果您正在使用例如。用于测试的NUnit框架,您可以使用TestCaseAttribute来装饰您的测试,以使用许多不同的参数运行测试并返回值。