Задать вопрос
@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% протестирован?
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 2
toxicmt
@toxicmt
кофаундер Хекслета
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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽