Unit testing 也测试简单的代码?

Unit testing 也测试简单的代码?,unit-testing,tdd,Unit Testing,Tdd,我曾经尝试过单元测试,但我不是一个超级粉丝;这与其说是一种恩惠,不如说是一种负担。那么,对于这个简单的2D point类,我应该进行哪些测试呢 public class Point{ int x; int y; public Point(int px, int py) { x = px; y = py; } public double distanceTo(Point other) { // Pythag

我曾经尝试过单元测试,但我不是一个超级粉丝;这与其说是一种恩惠,不如说是一种负担。那么,对于这个简单的2D point类,我应该进行哪些测试呢

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.distance)编写测试,任何可能导致溢出的参数,以及任何可能导致浮点精度损失的参数。至少要为四件事编写测试。

单元测试的目的不是在编写代码时确保代码正常工作,因为面对它,如果编写代码和单元测试,您将要测试的只是编写代码时考虑的相同情况,但要确保下一个使用代码执行操作的bozo不会破坏它。即使那个笨蛋就是你。

单元测试的目的不是确保你的代码在编写时能正常工作,因为面对它,如果你编写了代码和单元测试,您将要测试的只是编写代码时考虑的相同情况,但要确保下一个使用代码执行操作的bozo不会破坏它。即使那个笨蛋就是你。

不,即使你称之为简单代码,也有可能出错

你必须运行一次这些方法才能知道它们是有效的,对吗?将该调用捕获为单元测试并以自动化方式运行有什么不对

如果您同意这一点,那么值得讨论该单元将给您带来的所有其他好处:

文档-这就是你如何正确和不正确地使用我的类;下面是每种情况下发生的情况 更好的设计——如果你发现你的类很难使用或理解,你的客户也一样。 作为累积项目套件的一部分运行。一个测试可能会成功,但您可能会因为其他更改而中断它。运行所有测试将确保您检查了这一点。 重构的安全网。如果你曾经不得不对你的应用程序进行更改,那么单元测试应该在之前和之后运行。 至于你的距离法,我不知道当你谈论四个象限时你在想什么是的,我知道它们是什么。这不是测试所必需的

但是,是的,您应该进行测试,以显示在抛出NPE时传入空点时会发生什么情况?还有别的例外吗?静默返回零?;在与目标相同的点上传球,以确保获得一个小的零距离。如果它由于浮点表示而变小,会发生什么情况?你准备好了吗?如果你通过一个非常大的点怎么办?是否会出现溢出问题?您的方法可能很幼稚,可以计算组件平方和的平方根。所以,当你将一个非常大的数平方,结果是溢出,你的方法会做什么


我的观点是,它并不总是像你想象的那么简单

不,即使使用你所谓的简单代码,也有可能出错

你必须运行一次这些方法才能知道它们是有效的,对吗?将该调用捕获为单元测试并以自动化方式运行有什么不对

如果您同意这一点,那么值得讨论该单元将给您带来的所有其他好处:

文档-这就是你如何正确和不正确地使用我的类;下面是每种情况下发生的情况 更好的设计——如果你发现你的类很难使用或理解,你的客户也一样。 作为累积项目套件的一部分运行。一个测试可能会成功,但您可能会因为其他更改而中断它。运行所有测试将确保您检查了这一点。 重构的安全网。如果你曾经不得不对你的应用程序进行更改,那么单元测试应该在之前和之后运行。 至于你的距离法,我不知道当你谈论四个象限时你在想什么是的,我知道它们是什么。这不是测试所必需的

但是,是的,您应该进行测试,以显示在抛出NPE时传入空点时会发生什么情况?还有别的例外吗?静默返回零?;在与目标相同的点上传球,以确保获得一个小的零距离。如果它由于浮点表示而变小,会发生什么情况?你准备好了吗?如果你通过一个非常大的点怎么办?是否会出现溢出问题?您的方法可能很幼稚,可以计算组件平方和的平方根。所以,当你将一个非常大的数平方,结果是溢出,你的方法会做什么


我的观点是,它并不总是像你想象的那么简单

< p>既然你放了TDD标签,那就考虑在你写之前编写你的单元测试。
r代码。在代码下,我甚至考虑接口。您的测试应该定义类所做的事情。

自从您放置TDD标记之后,那就考虑在编写代码之前编写单元测试。在代码下,我甚至考虑接口。您的测试应该定义类的功能。

您可以通过地理地图上的几个示例来测试距离。至少使用一个小距离和一个大距离 这是伪代码

// 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)

我不知道如何联合测试测线指向其他点

您可以通过地理地图上的几个示例来测试距离。至少使用一个小距离和一个大距离 这是伪代码

// 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)
我不知道如何将测线与其他测线连接起来

每个方法需要多少测试

如果您不使用TDD,而是最后测试,您将面临相同的问题。即使你不做单元测试,你也会面临这样一个问题:我的软件需要多少系统测试

我曾经有个经理问我

我们能做的最低测试量是多少

没有,我回答。学生也开悟了

实际上,测试就是权衡成本和收益。你总是有有限的测试资源,即使唯一的资源是你的耐心。因此,我认为最好问问什么技术可以产生最具成本效益的测试。我非常喜欢一种方法

每个方法需要多少测试

如果您不使用TDD,而是最后测试,您将面临相同的问题。即使你不做单元测试,你也会面临这样一个问题:我的软件需要多少系统测试

我曾经有个经理问我

我们能做的最低测试量是多少

没有,我回答。学生也开悟了


实际上,测试就是权衡成本和收益。你总是有有限的测试资源,即使唯一的资源是你的耐心。因此,我认为最好问问什么技术可以产生最具成本效益的测试。我非常喜欢一种方法。

lineTo函数在Point类中究竟做了什么?在这个项目中,我经常需要查看其他两个点之间的所有点。我可以做一些RayCaster行吗?类,但这更简单。你有更好的方法吗?lineTo函数在Point类中到底做了什么?在这个项目中,我经常需要查看其他两个点之间的所有点。我可以做一些RayCaster行吗?类,但这更简单。你有更好的办法吗?我听说过,但真的吗?得到两点之间的距离?有些东西只是需要知识。也许这是一个从别人那里继承来的复杂的方法,我敢打赌你是用一种幼稚的方式计算两点之间的距离,很容易溢出。你认为简单的事情可能不像你想象的那么简单。好吧,撇开lineTo和distanceTo不在点类中的问题不谈,因为它们是点所在平面的属性,而不是点本身的属性,我会说是的,编写一个测试用例来测试所有的角情况,就像沿着每个轴的直线,零长度线,等等。你永远不知道谁会打破什么。是的,它很容易溢出;它适用于较小的距离,所以它不应该是一个问题,但如果它成为一个问题,我可以修复它。所以你是说每当你看到一个接受int的方法,你就写溢出检查单元测试,对吗?@Trystan,我测试什么是合适的。您的方法返回一个double。如果你把这些积分平方,你确定你的状态很好吗?你来这里是为了得到批准吗?我听说了,但真的吗?得到两点之间的距离?有些东西只是需要知识。也许这是一个从别人那里继承来的复杂的方法,我敢打赌你是用一种幼稚的方式计算两点之间的距离,很容易溢出。你认为简单的事情可能不像你想象的那么简单。好吧,撇开lineTo和distanceTo不在点类中的问题不谈,因为它们是点所在平面的属性,而不是点本身的属性,我会说是的,编写一个测试用例来测试所有的角情况,就像沿着每个轴的直线,零长度线,等等。你永远不知道谁会打破什么。是的,它很容易溢出;它适用于较小的距离,所以它不应该是一个问题,但如果它成为一个问题,我可以修复它。所以你是说每当你看到一个接受int的方法,你就写溢出检查单元测试,对吗?@Trystan,我测试什么是合适的。您的方法返回一个double。如果你把这些积分平方,你确定你的状态很好吗?你来这里是为了得到批准吗?…事情并不总是像你想象的那么简单。在这种情况下是这样的。最长距离
可能是100。它在一个网格上,只使用整数。这会增加值,怎么。。。?我现在投票决定结束这场比赛。如果您不想编写测试,可以。这是你的葬礼。您正在选择性地添加信息。这充其量只是一个写得不好的问题。我认为这是一个主观的、有争议的问题,值得结束……它并不总是像你想象的那么简单。在这种情况下是这样的。最长的距离可能是100英里。它在一个网格上,只使用整数。这会增加值,怎么。。。?我现在投票决定结束这场比赛。如果您不想编写测试,可以。这是你的葬礼。您正在选择性地添加信息。这充其量只是一个写得不好的问题。我认为它现在是主观的和有争议的,值得结束。但是你只会测试你打算如何使用它-如果你不打算通过空值,那么你就不会编写通过空值的测试。当我首先编写测试时,我不会测试很多东西,因为我不打算用这样的代码,与其他答案所暗示的正好相反。@ Trystan看起来好像其他的答案没有考虑TDD标签,我的答案是TDD特有的。谷歌搜索敏捷秋季,观看演示如何进行TDD的屏幕广播。@Trystan如果您先编写单元测试,那么您将拥有100%的覆盖率,并且您将不会编写不需要的功能。如果允许通过指针传递NULL,那么就编写一个单元测试。如果不是,那么如果您使用c++编写代码,则通过引用进行传递,但您只会测试您计划如何使用它-如果您不计划传递null,则不会编写传递null的测试。当我首先编写测试时,我不会测试很多东西,因为我不打算用这样的代码,与其他答案所暗示的正好相反。@ Trystan看起来好像其他的答案没有考虑TDD标签,我的答案是TDD特有的。谷歌搜索敏捷秋季,观看演示如何进行TDD的屏幕广播。@Trystan如果您先编写单元测试,那么您将拥有100%的覆盖率,并且您将不会编写不需要的功能。如果允许通过指针传递NULL,那么就编写一个单元测试。如果不是,则在C++中通过代码进行传递