Тестировать простой код тоже? - PullRequest
1 голос
/ 20 декабря 2010

Я пробовал юнит-тестирование, и я не большой поклонник;это было гораздо больше бремени, чем благо.Итак, какие тесты я должен пройти для этого простого 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....
    }
}

Сколько тестов мне нужно для каждого метода?Другая точка может находиться в том же месте, что и первая, или в одном из четырех квадрантов, или в нуле.Итак, шесть модульных тестов для каждого метода?

Возможно ли, чтобы код был настолько простым и очевидным, что модульные тесты дают настолько мало значения, что они того не стоят?

(Ответы на данный моментскажем: тесты должны быть написаны для любого параметра, который может быть нулевым, любого параметра, который может быть самим объектом (то есть this.distanceTo (this)), любого параметра, который может вызвать переполнение, и любого параметра, который может вызвать плавающую точкупотеря точности. По крайней мере, четыре вещи для написания тестов.)

Ответы [ 5 ]

8 голосов
/ 20 декабря 2010

Нет, можно ошибаться даже с тем, что вы называете "простым кодом".

Вам придется один раз запустить методы, чтобы понять, что они работают, верно?Что плохого в том, чтобы захватить этот вызов в качестве модульного теста и запустить его автоматически?

Если вы согласны с этим, стоит обсудить все другие преимущества, которые даст вам устройство:

  1. документация - "вот как вы правильно и неправильно используете мой класс; вотчто происходит в каждом конкретном случае "
  2. лучший дизайн - если вы считаете, что ваш класс сложен в использовании или понимании, то и ваши клиенты тоже.
  3. , работающий как часть накопленного набора проектов.Один тест может быть успешным, но вы можете сломать его с другими изменениями.Выполнение всех тестов обязательно проверит это.
  4. Защитная сеть для рефакторинга.Если вам когда-либо придется вносить изменения в свое приложение, модульные тесты должны выполняться до и после.

Что касается вашего метода расстояния, я не знаю, о чем вы думаете, когда говорите "четыре квадранта »(да, я знаю, что это такое).Это не то, что необходимо для тестирования.

Но да, вы должны протестировать, чтобы показать, что происходит, когда передается нулевая точка (если вы бросите NPE - какое-то другое исключение - молча вернуть ноль?);пройдите в ту же точку, что и цель, чтобы убедиться, что вы получили небольшое (надеюсь, нулевое) расстояние.Что произойдет, если он маленький из-за представлений с плавающей запятой?Вы готовы к этому?Что если вы пройдете в очень большой точке?Будут ли проблемы переполнения?Ваш метод, вероятно, достаточно наивен, чтобы вычислить квадратный корень из суммы квадратов компонентов.Поэтому, когда вы возводите в квадрат очень большое число, и в результате получается переполнение, что будет делать ваш метод?

Я хочу сказать, что это не всегда так просто, как вы предполагаете.

7 голосов
/ 20 декабря 2010

Цель модульного тестирования не состоит в том, чтобы убедиться, что ваш код работает, когда вы его написали (потому что, если честно, если вы написали код и модульный тест, все, что вы собираетесь тестировать, это те же самые угловые случаи, которые вы подумали о том, когда вы писали код), но чтобы следующий бозо что-то делал с вашим кодом, это не сломало. Даже если этот бозо это ты.

2 голосов
/ 20 декабря 2010

Поскольку вы ставите тег TDD, тогда учтите, что вы пишете свои модульные тесты, прежде чем писать свой код.Под кодом я считаю даже интерфейс.Ваши тесты должны определить, что делает класс.

1 голос
/ 31 декабря 2010

Сколько тестов мне нужно для каждого метода?

Вы сталкиваетесь с тем же вопросом, если не используете TDD, а вместо этого последний тест. И даже если вы не проводите модульное тестирование, вы сталкиваетесь с вопросом «сколько (системных) тестов мне нужно для моего программного обеспечения».

Однажды у меня был менеджер, спросите меня

Какое минимальное количество тестов мы можем сделать?

«Нет», - ответил я. И ученик был просветленным.

Реально тестирование - это взвешивание затрат и выгод. У вас всегда есть ограниченные ресурсы для тестирования (даже если единственным ресурсом является ваше терпение). Поэтому я полагаю, что лучше спросить, какой метод дает результаты, которые являются наиболее экономически эффективными. У меня есть сильное предпочтение эквивалентного разбиения .

0 голосов
/ 22 декабря 2010

Вы можете проверить расстояние с помощью нескольких примеров, которые вы можете получить из географической карты. Используйте хотя бы одно небольшое расстояние и большое расстояние (это псевдокод)

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

Я понятия не имею, как выполнить юнит-тестирование линии (указать другую)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...