Строгость при сборе тестовых примеров для модульного тестирования

StackOverflow https://stackoverflow.com/questions/12569

  •  08-06-2019
  •  | 
  •  

Вопрос

Допустим, у нас есть простая функция, определенная на псевдоязыке.

List<Numbers> SortNumbers(List<Numbers> unsorted, bool ascending);

Мы передаем несортированный список чисел и логическое значение, указывающее порядок сортировки по возрастанию или убыванию.В ответ мы получаем отсортированный список чисел.

По моему опыту, некоторые люди лучше улавливают граничные условия, чем другие.Вопрос в том, "Как вы узнаете, когда "закончите" захват тестовых примеров"?

Мы можем начать перечислять случаи прямо сейчас, и какой-нибудь умный человек, несомненно, придумает "еще один" случай, который не охвачен ни одним из предыдущих.

Это было полезно?

Решение

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

Еще одно замечание, которое я хочу сделать об инструментах покрытия кода.На таком языке, как C # или Java, где у вас есть много методов get / set и подобных им, вы должны нет делайте съемку для 100% охвата.Это означает, что вы тратите слишком много времени на написание тестов для тривиального кода.Ты Только хотите 100% охватить вашу сложную бизнес-логику.Если ваша полная кодовая база имеет покрытие ближе к 70-80%, вы делаете хорошую работу.Если ваш инструмент покрытия кода допускает несколько показателей покрытия, лучшим из них является "покрытие блока", который измеряет покрытие "базовых блоков".Другими типами являются покрытие классов и методов (которые не дают вам столько информации) и покрытие линий (которое слишком мелкозернистое).

Другие советы

Как вы узнаете, когда "закончите" захват тестовых примеров?

Вы этого не делаете.Вы не можете достичь 100%, за исключением самых тривиальных случаев.Кроме того, 100% покрытие (линий, контуров, условий ...) не говорит о том, что вы выполнили все граничные условия.

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

Отрывок из Искусство тестирования программного обеспечения автор : Гленфорд Дж .Майерс:

  1. Если условие ввода задает диапазон значений, напишите тестовые примеры для концов диапазона и тестовые примеры с недопустимым вводом для ситуаций сразу за пределами этих пределов.
  2. Если входное условие задает несколько значений, напишите тестовые примеры для минимального и максимального количества значений, а также по одному ниже и сверх этих значений.
  3. Используйте руководство 1 для каждого условия вывода.
  4. Используйте руководство 2 для каждого условия вывода.
  5. Если ввод или вывод программы представляет собой упорядоченный набор, сосредоточьте внимание на первом и последнем элементах набора.
  6. Кроме того, используйте свою изобретательность для поиска других граничных условий

(Я вставил только самый минимум по соображениям авторского права.)

Пункты 3.и 4.вышесказанное очень важно.Люди склонны забывать граничные условия для выходных данных.5.все в порядке.6.на самом деле это не помогает :-)

Краткий экзамен

Это сложнее, чем кажется.Майерс предлагает этот тест:

Программа считывает три целых значения из диалогового окна ввода.Эти три значения представляют длины сторон треугольника.Программа выводит сообщение, в котором указывается, является ли треугольник скалярным, равнобедренным или равносторонним.

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

Напишите свои тестовые примеры.Сколько их у вас?Майерс задает 14 вопросов о вашем наборе тестов и сообщает, что высококвалифицированные профессиональные программы составляют в среднем 7,8 из 14 возможных.

С практической точки зрения я составляю список тестов, которые, по моему мнению, необходимо пройти перед принятием.Я тестирую их и автоматизирую там, где это возможно.Исходя из того, сколько времени я выделил на выполнение задачи или сколько времени мне было предоставлено, я расширяю свой тестовый охват, включив в него элементы, которые должны пройти проверку до принятия.Конечно, грань между "должен" и should - это субъективно.После этого я обновляю автоматические тесты по мере обнаружения ошибок.

@Кит

Я думаю, вы справились с задачей, на покрытие кода важно обратить внимание, если вы хотите увидеть, насколько вы "готовы", но я думаю, что 100% - это немного нереалистичная цель.Стремление к 75-90% даст вам довольно хорошее покрытие, не переусердствуя...не проводите тестирование исключительно ради достижения 100% результата, потому что в этот момент вы просто напрасно тратите свое время.

Хороший инструмент покрытия кода действительно помогает.

100% охват не означает, что он определенно прошел надлежащее тестирование, но это хороший показатель.

Для .Net NCover довольно хорош, но больше не является открытым исходным кодом.


@Mike Stone - Да, возможно, это должно было быть "высокое покрытие" - мы стремимся к минимуму в 80%, после примерно 95% доходность обычно снижается, особенно если у вас код с фигурными скобками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top