Return; // we're expecting the
Else // exception, otherwise
Assert(false); // force a test failure
}
assert(Math.abs(expected-result) } Затем мы можем вызвать эту подпрограмму, чтобы проверить нашу функцию излечения квадратного корня: TestValue(-4.0, 0.0); TestValue(0.0, 0.0); TestValue(2.0, 1.4142135624); TestValue(64.0, 8.0); TestValue(1.0e7, 3162.2776602); Это весьма простая процедура тестирования; в реальном мире любой нетривиальный модуль скорее всего будет зависеть от ряда других модулей, поэтому, может быть, есть смысл протестировать их сочетание? Предположим, есть модуль А, использующий модули LinkedList и Sort. Мы осуществляем тестирование в следующем порядке: 1. Полностью тестируем контракт модуля LinkedList. 2. Полностью тестируем контракт модуля Sort. 3. Тестируем контракт модуля А, который полагается на другие контракты, но не раскрывает их напрямую. При этом способе тестирования вы вначале обязаны проводить тестирование подкомпонентов. Если модули LinkedList и Sort успешно прошли тестирование, а модуль А испытания не прошел, мы можем быть вполне уверены, что проблема заключается в модуле А или в том, как модуль А использует один из подкомпонентов. Эта методика способствует уменьшению трудоемкости процесса отладки: можно быстро сосредоточиться на вероятном источнике проблем в пределах модуля А и не тратить время на изучение его подкомпонентов. Зачем вся эта головная боль? Прежде всего, хотелось бы избежать создания «бомбы замедленного действия», той, что остается незамеченной и позже взрывается в самый неподходящий момент во время работы над проектом. Подчеркивая важность «тестирования в рамках контракта», мы пытаемся, насколько это возможно, избежать катастроф, возникающих в будущем. Подсказка 48: Проектируйте с учетом тестирования Когда вы проектируете модуль или даже целую программу, вы обязаны проектировать ее контракт и программу для проверки этого контракта. Проектируя программу, которая проходит тестирование и выполняет соответствующий контракт, вы можете учесть граничные условия и другие аспекты, на которые в иных случаях не обратили бы внимания. Лучше всего устранять ошибки, избежав их с самого начала. На самом деле, при создании процедуры тестирования до реализации программы вам приходится испытывать интерфейс перед тем как принять его.
Создание модульных тестов
Модульные тесты не должны оказываться где-то на периферии исходной древовидной схемы. Они должны располагаться так, чтобы с ними было удобно обращаться. В случае небольших проектов можно внедрить модульный тест в сам модуль. Для более крупных проектов можно поместить каждую из процедур тестирования в отдельный подкаталог. В любом случае необходимо помнить, что если модуль сложно отыскать, то он не будет использован.