为定价方法编写测试

为定价方法编写测试

问题描述:

我刚接触单元测试/ 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 /存储库,因为这看起来有点鸡鸡蛋类型的情况。

+0

http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530/ref=sr_1_1?s=books&ie=UTF8&qid=1325797578&sr=1-1 – Bueller 2012-01-05 21:07:27

这听起来像是你的定价逻辑有两个元素。

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

  2. 一个函数,它接受一个价格矩阵和一个Product实例并返回一个价格。

测试价格矩阵是没有意义的;这些数字是任意的。如果你觉得你需要测试这个功能,我会用不同的模拟产品传递不同的假的,硬编码的测试矩阵,并进行测试以验证合适的价格。最相关的边缘情况可能是当你要求为一个截断数量的价格准确地或逐个地逐个求出截止数量的价格时。

+0

将接受此作为答案虽然所有的答案都非常感谢我的思路。 – MPD 2012-01-05 21:54:15

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

单元测试是关于测试最小可能的代码单元,因此在这种情况下,您所关心的只是该方法返回预期价格。如果该方法是从外部获取定价数据,那么它会做两件事:获取定价数据和计算价格。您已发现违规行为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); 

然后你就可以检查基于已知的定价数据预期的结果。

+0

谢谢Igby帮助澄清我的想法。 – MPD 2012-01-05 22:19:34

+0

您希望尽可能多地分担担忧,而不会达到收益递减点。有可能过度应用优秀设计的原则,最终导致架构复杂化并抹去您寻求的好处。如果从价格外部注入定价数据感觉更整洁,不太过于模糊,那就去做吧。这当然是一种常见的设计模式。但总是要权衡成本,并记住[YAGNI](http://en.wikipedia.org/wiki/YAGNI)。 – 2012-01-05 22:27:59

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

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

您问及测试每种尺寸/数量组合。如果没有定义的计算来确定这一点,并且您有用于计算的变量值,那么您无法真正测试。

您可以测试此:X和Y的数量大小应给予价格Z.插件的X和Y的值,并确保你获得预期值Z.

如果什么也没有价值对于X还是Y?你失败了吗?返回0?这些东西你可以测试。