2008-11-20 6 views
10

Я просто участвую в модульном тестировании и написал несколько коротких тестов, чтобы проверить, правильно ли работает функция, называемая isPrime().Как определить тестовые примеры для модульных тестов?

У меня есть тест, который проверяет, работает ли функция, и имеет некоторые тестовые данные в виде некоторых чисел и ожидаемого возвращаемого значения.

Сколько я должен проверить? Как я могу решить, на какой тест? В чем здесь лучшие практики?

Один из подходов состоит в том, чтобы генерировать 1000 простых чисел, а затем перебирать их все, а другой - просто выбрать 4 или 5 и протестировать их. Какая правильная вещь?

ответ

8

Вы хотели бы проверить крайние случаи. Насколько велика простая цифра, которую должен использовать ваш метод? Это будет зависеть от того, какое представление (тип) вы использовали. Если вас интересует только небольшой (действительно относительный термин при использовании в теории чисел), вы, вероятно, используете int или long. Протестируйте несколько самых больших простых чисел в выбранном вами представлении. Убедитесь, что вы также проверите некоторые не простые числа. (Это намного проще проверить независимо.)

Естественно, вы также захотите протестировать несколько небольших чисел (простые числа и простые числа) и несколько в середине диапазона. Горстке каждого должно быть много. Также убедитесь, что вы выбрали исключение (или верните код ошибки, в зависимости от ваших предпочтений) для чисел, находящихся вне допустимых значений.

1

Задайте себе вопрос. ЧТО ТОЧНО Я хочу проверить. И проверьте самое главное. Тест, чтобы убедиться, что он в основном делает то, что вы ожидаете от него в ожидаемых случаях.

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

Если вы хотите, чтобы ваша функция правильно применяла алгоритм и работала вообще - вероятно, будет достаточно некоторых простых чисел.

Если вы хотите доказать, что метод для нахождения простых чисел ПРАВИЛЬНО - 100000 простых чисел не будет достаточно :) Но вы не хотите, чтобы проверить последний (вероятно) ...

Только вы знаете, что вы хотите протестировать! :)

PS Я использую циклы в модульных тестах, это не всегда неправильно, но я подумал бы дважды, прежде чем делать это. Тестовый код должен быть ОЧЕНЬ прост. Что, если что-то пойдет не так, и есть ошибка в вашем тесте ???? :) Однако вы должны стараться избегать дублирования тестового кода как обычного дублирования кода. Кто-то должен поддерживать тестовый код.

ЛЮДИ ПОЖАЛУЙСТА ОТЗЫВ ПОЧЕМУ ВЫ СЧИТАЕТЕ ЭТО БЫЛО ДВА СТОИТ DOWNVOTES :)

+0

Я не проголосовал за вас, но я бы предположил, что люди не согласны с тем, что вы сказали об этом, не являясь необходимым для проверки случаев краев. Это именно те случаи, которые требуют наибольшего тестирования. Кроме этого, я думал, что у вас хорошие моменты, особенно. о ошибках в тесте. – Clayton 2008-11-20 21:17:53

+0

@ Clayton - Хорошо, но я не понимаю этого «крайнего» случая ... Я имею в виду ... Я знаю, это то, что вы читали в своей первой тестовой книге, но что такое «краевой случай» для этого пример? Может ли кто-нибудь сказать мне? Убедитесь, что работает 2^32? Или что -3 не делает? Хорошо, теперь скажите мне, что такое 2^32? – badbadboy 2008-11-20 21:24:34

+0

@ Клейтон - Что я знаю о 2^32 в моем домене? Если я знаю, что это конкретный важный случай для меня - я проверю его, но почему его называют краевым тестом? Если ваша программа вылетает из-за неправильного ввода пользователя - это ошибка в обработке графического интерфейса, а не в вашем классе домена. Тем не менее, я согласен с тем, что – badbadboy 2008-11-20 21:26:36

0

Несколько вопросов, ответы могут сообщить свое решение:

  • Насколько важно правильное функционирование этого кода?
  • Возможно ли внедрение этого кода в будущем? (если это так, проверьте больше, чтобы поддержать будущие изменения)
  • Является ли публичный договор этого кода в будущем изменяться?(если это так, проверьте меньше - чтобы уменьшить количество тестового кода отбрасывания)
  • Каково покрытие кода, все ли филиалы посещены?
  • Даже если код не ветвится, проверяются граничные соображения?
  • Выполняют ли тесты быстро?

Редактировать: Хм, так что посоветуйте в своем конкретном сценарии. Поскольку вы начали писать блок-тесты вчера, у вас может не возникнуть опыт, чтобы решить среди всех этих факторов. Позвольте мне помочь:

  • Этот код, вероятно, не слишком важен (никто не умирает, никто не идет на войну, никто не предъявляется к суду), поэтому анализ тестов будет прекрасен.
  • Реализация, вероятно, не изменится (методы простых чисел хорошо известны), поэтому нам не нужны тесты для поддержки этого. Если реализация изменится, возможно, это связано с наблюдаемым недостающим значением. Это может быть добавлено как новый тест во время изменения.
  • Публичный договор об этом не изменится.
  • Получите покрытие 100% кода на этом. Нет причин писать код, который тест не посещает в этом случае. Вы должны сделать это с небольшим количеством тестов.
  • Если вам небезразличен код, когда вызывается нуль, проверьте это.
  • Небольшое количество тестов должно выполняться быстро. Это позволит им работать часто (как разработчиками, так и автоматизацией).

Я испытал бы 1, 2, 3, 21, 23, "большой" простые (5 цифр), "большой", не простое и 0, если вы заботитесь, что это делает с 0.

1

в целом, тест, как много случаев, как вы должны чувствовать себя комфортно/уверены

также в целом, проверить базу/нулевой случай, максимальный случай, и, по меньшей мере, один медиану/средний случай

также тест ожидается -исполнительные случаи, если применимо

если y вы не уверены в своем главном алгоритме, тогда непременно проверите его с первыми 1000 простых чисел или около того, чтобы получить доверие.

1

«Остерегайтесь ошибок. Я доказал, что вышеуказанный алгоритм правильный, но еще не проверял его ».

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

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

10

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

0

Чтобы быть уверенным, вам придется протестировать их все.:-)

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

Другое дело - убедиться, что вы понимаете пределы своего числа, независимо от того, что это такое. По крайней мере, это поставит верхний предел размера, который вы можете проверить. Например, если вы используете 32-битный беззнаковый int, вы никогда не сможете тестировать значения, превышающие 4G. Возможно, ваш лимит будет ниже этого, в зависимости от деталей вашей реализации.

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

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

Также рассмотрите, как вы собираетесь генерировать свой список простых чисел для тестирования. Можете ли вы доверять этому списку? Как прошли эти номера и кем?

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

0

«Если это стоит того, стоит проверить»
«Если это не стоит тестировать, то почему вы тратите свое время на это?»

Я предполагаю, что вы не подписались на тест сначала, где вы пишете тест, прежде чем писать код?
Не волнуйтесь, я уверен, что вы не одиноки.
Как было сказано выше, проверьте края, отличное место для начала. Также необходимо проверить плохие случаи, если вы проверяете только то, что знаете, вы можете быть уверены, что в худшем случае произойдет плохой случай.

О, и «Я только что нашел последнюю ошибку» - HA HA.

Смежные вопросы