Что мы подразумеваем под кодом?При модульном тестировании, о котором я думаю, мы говорим здесь, мы тестируем определенные методы и классы.
Я думаю, что не могу полностью протестировать свой код, потому что пишу тесткод, зная, что я хочу получить
Другими словами, вы исследуете, выполняет ли какой-то код контракт.Рассмотрим пример:
int getInvestvalue( int depositCents, double annualInterestRate, int years) {
}
Какие тесты вы можете разработать?Если вы разработаете хороший набор тестов, вы можете быть уверены в этом.Таким образом, мы могли бы попробовать следующие виды ввода:
deposit 100, rate 5.0, years 1 : expected answer 105
deposit 100, rate 0, years 1 : expected answer 100
deposit 100, rate 10, years 0 : expected anwer 100
Что еще?Как насчет отрицательной ставки?
Что еще интереснее, как насчет очень высокой процентной ставки, такой как 1 000 000.50 и 100 000 лет, что произойдет с результатом, будет ли оно соответствовать целому числу? Суть разработки этого теста состоит в том, что он бросает вызов интерфейсу - почемунет ли документально подтвержденных исключений?
Тогда возникает вопрос: как нам определить эти тесты?Я не думаю, что есть единый подход, который приводит к созданию комплексного набора, но вот несколько вещей, которые следует учитывать:
- Края: ноль, один, два, много.В моем примере мы не просто делаем ставку 5%.Мы рассматриваем особенно частные случаи.Ноль особенный, один особенный, отрицательный особенный, большое число особенное ...
- Угловые случаи: комбинации ребер.В моем примере это большой показатель и большое количество лет.Выбор их является чем-то вроде искусства, и ему помогают наши знания о реализации: здесь мы знаем, что существует эффект «множителя» между показателями и годами.
- Белая коробка: использование знания реализации для управления кодомохват.Регулировка входов, чтобы заставить код двигаться по отдельным путям.Например, если вы знаете, что в коде есть условный путь «если отрицательный коэффициент», то это ключ к включению теста отрицательного показателя.