@TAnonim

Правильный подход к тестированию в приложениях на php?

В документации к PHPUnit и некоторых статьях встречается код такого типа:
public function testMethod() {
        $expectedResult = 100;
        $result = $this->testclass->testMethod(1, 2);
        $this->assertEquals($expectedResult, $result);
}

Несомненно, это лучше, чем писать var_dump'ы и проверять выходные значения методов вручную. Но вопрос в следующем: этот тест дает мне знать, корректно ли метод работает на значениях 1 и 2. И если я напишу еще 1000 такого типа тестов это лишь будет гарантировать, что всё хорошо на этих 1000 наборах данных, а вдруг ошибка как раз в другом, 1001-м наборе? Или я как-то не понимаю концепцию юнит-тестов.

И еще, на GitHub можно часто встретить теги "99% test coverage", "X% test coverage". Как они понимают, что продукт протестирован на n процентов? Как я могу понять, что мой метод на 100% протестирован?
  • Вопрос задан
  • 194 просмотра
Решения вопроса 2
toxicmt
@toxicmt
CTO at hexlet.io
coverage говорит о покрытии тестами конкретных строк. Если во время прогона тестов не были затронуты какие-то строки исходного кода, то coverage будет менее 100%. В среднем считается что хорошее покрытие это > 80%. 100% достичь слишком трудно и дорого (и не нужно).

> И если я напишу еще 1000 такого типа тестов это лишь будет гарантировать, что всё хорошо на этих 1000 наборах данных, а вдруг ошибка как раз в другом, 1001-м наборе?

Гарантий вам никто не даст. Для гарантий есть формальная верификация, но это больше про математику чем про программирование. А так это ответственность программиста тестировать пограничные случаи. Ничего страшного в том что вы их пропустили обычно не приосходит. Просто если возникнет баг, то сначала добавите тест который его воспроизведет, а затем уже почините.

Из интересного:

* property-based testing https://en.wikipedia.org/wiki/QuickCheck
* bdd behat.org/en/latest/guides.html
* browser tests https://codeception.com/
* как писать тесты (концептуальная история) https://ru.hexlet.io/blog/posts/how-to-test-code
Ответ написан
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Сначала нужно определять граничные случаи и выбирать тест внутри этих диапазонов.
Например в вашем случае используется два целых числа:
1. Даст ли метод верный ответ, если одно или оба числа отрицательные или равны нулю
2. Даст ли метод верный ответ, если в процессе произойдёт переполнение переменной
Остальное можно придумать в зависимости от декларации и кода метода.
Поэтому вполне можно проверить пары:
5, 19
-5, -19
5, -19
-5, 19
0, 19
5, 0
16874681246, 1254781628

если все тесты будут пройдены, то с большой вероятностью другие пары так же дадут верный результат.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы