我尝试过单元测试,我不是一个大粉丝;它更多的是负担而不是恩惠。那么我应该对这个简单的2D点类进行哪些测试?
public class Point{
int x;
int y;
public Point(int px, int py) {
x = px;
y = py;
}
public double distanceTo(Point other) {
// Pythagorean theorem
}
public ArrayList<Point> lineTo(Point other) {
// Bresenham's line algorithm. The same thing I've
// implemented a dozen times in differnt languages
// and can type from memory....
}
}
每种方法需要多少次测试?另一点可以与第一个或同一个四个象限中的一个位于同一位置,或者为空。那么每种方法有六个单元测试吗?
是否有可能让代码如此简单明显,以至于单元测试提供的价值太少而不值得呢?
(到目前为止的回复说:应该为任何可以为null的参数,可以是对象本身的任何参数(即this.distanceTo(this)),任何可能导致溢出的参数编写测试,以及任何可能导致浮点精度损失的参数。至少要写四次测试的东西。)
答案 0 :(得分:8)
不,即使你称之为“简单代码”,也有可能犯错误。
你必须运行一次方法才能知道它们有效,对吗?将该呼叫作为单元测试捕获并以自动方式运行它有什么问题?
如果您同意这一点,那么值得讨论该单位将为您提供的所有其他好处:
至于你的距离法,当你谈到“四象限”时,我不知道你在想什么(是的,我知道那些是什么)。这不是测试所必需的。
但是,是的,您应该测试以显示传入null Point时会发生什么(您是否应该抛出NPE?其他一些异常?静默返回零?);传递与目标相同的点,以确保您获得一个小的(希望为零)距离。如果由于浮点表示而变小,会发生什么?你准备好了吗?如果你传入一个非常大的点怎么办?会有溢出问题吗?你的方法可能很天真,足以计算组件平方和的平方根。因此,当你对一个非常大的数字进行平方,结果是溢出时,你的方法会做什么?
我的观点是,并不总是像你想象的那么简单。
答案 1 :(得分:7)
单元测试的目的不是为了确保你的代码在编写时能够正常工作(因为面对它,如果你编写了代码和单元测试,那么你要测试的就是你想到的相同的角落情况关于你何时编写代码)但要确保下一个bozo对你的代码做一些事情并不会破坏它。即使那个bozo就是你。
答案 2 :(得分:2)
由于您放置了TDD标记,因此请考虑在编写代码之前编写单元测试。在代码下我甚至考虑接口。您的测试应该定义类的功能。
答案 3 :(得分:1)
每种方法需要多少次测试?
如果您不使用TDD,则面临同样的问题,而是测试最后一次。即使您没有进行单元测试,也会面临“我的软件需要多少次(系统)测试”的问题。
我曾经有一位经理问我
我们可以做的最低测试量是多少?
“没有”,我回答。瞳孔开悟了。
实际上,测试是关于权衡成本和收益。您总是拥有有限的测试资源(即使唯一的资源是您的耐心)。因此,我相信最好问一下哪种技术可以产生最具成本效益的测试。我非常喜欢equivalence partitioning方法。
答案 4 :(得分:0)
您可以使用地理地图中的一些示例来测试距离。使用至少一个小距离和一个很大的距离 (这是伪代码)
// Distance between hamburg and bremen (germany) sould be between 100 and 200 km.
Point HamburgInGermany = new Point(...)
Point BremenInGermany = new Point(...)
Assert.IsBetween(HamburgInGermany.distanceTo(BremenGermany),100,200))
// Distance between hamburg and hamburg (germany) sould be between 0 and 20 km.
// using same point for both should not crash
// this may provoke division by 0
Assert.IsBetween(HamburgInGermany.distanceTo(HamburgInGermany),0,20))
// what happens if you have an illegal coordinate (ie 400 Degree-North)
我不知道如何对lineTo(Point other)进行单元测试