测试简单的代码呢?

时间:2010-12-19 22:24:02

标签: unit-testing tdd

我尝试过单元测试,我不是一个大粉丝;它更多的是负担而不是恩惠。那么我应该对这个简单的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)),任何可能导致溢出的参数编写测试,以及任何可能导致浮点精度损失的参数。至少要写四次测试的东西。)

5 个答案:

答案 0 :(得分:8)

不,即使你称之为“简单代码”,也有可能犯错误。

你必须运行一次方法才能知道它们有效,对吗?将该呼叫作为单元测试捕获并以自动方式运行它有什么问题?

如果您同意这一点,那么值得讨论该单位将为您提供的所有其他好处:

  1. 文档 - “这就是你如何正确和不正确地使用我的课程;这是每种情况下发生的事情”
  2. 更好的设计 - 如果您发现您的课程难以使用或理解,您的客户也将如此。
  3. 作为累积项目套件的一部分运行。一个测试可能会成功,但您可能会破坏其他更改。运行所有测试将确保你检查。
  4. 重构的安全网。如果您必须对应用程序进行更改,则应在之前和之后运行单元测试。
  5. 至于你的距离法,当你谈到“四象限”时,我不知道你在想什么(是的,我知道那些是什么)。这不是测试所必需的。

    但是,是的,您应该测试以显示传入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)进行单元测试