Если вы напечатаете значения ad2$Cost.x>=ad2$lower & ad2$Cost.x<=ad2$upper
, вы можете увидеть более одного логического условия в результате. Это потому, что в R все операции векторизованы.
Пример:
> cc =c(T,F)
> if (cc) print(cc)
[1] TRUE FALSE
Warning message:
In if (cc) print(cc) :
the condition has length > 1 and only the first element will be used
Поэтому используйте все или любую функцию, подобную этой:
> if (all(cc)) print(cc) #If all conditions are true
> if (any(cc)) print(cc)
[1] TRUE FALSE
Вы хотели бы проверить пограничные случаи. Насколько большой простое число является Вашим методом, который, как предполагают, смог обработать? Это будет зависеть, на каком представлении (тип) Вы использовали. Если Вы только интересуетесь маленьким (действительно относительное понятие при использовании в теории чисел) начала, Вы, вероятно, используете интервал или долго. Протестируйте горстку самые большие начала, Вы можете в представлении, которое Вы выбрали. Удостоверьтесь, что Вы проверяете некоторые непростые числа также. (Их намного легче проверить независимо.)
Естественно, Вы также захотите протестировать несколько небольших чисел (начала и неначала) и некоторые посреди диапазона. Горстка каждый должен быть много. Также удостоверьтесь, что Вы выдаете исключение (или возвратите код ошибки, какой бы ни Ваше предпочтение) для чисел, которые являются вне диапазона Ваших допустимых исходных данных.
Мне также сообщили, что каждый раз ошибка найдена, необходимо записать тест, чтобы проверить, что она фиксируется. Это кажется разумным мне, так или иначе.
в целом протестируйте столько случаев, сколько необходимо чувствовать себя удобными/уверенными
также в целом протестируйте основной/нулевой случай, максимальный случай и по крайней мере один средний/средний случай
также протестируйте случаи ожидаемого исключения, если применимо
если Вы не уверены в своем главном алгоритме, то любой ценой тестируют его с первыми 1 000 начал или так, для завоевывания доверия
"Остерегайтесь ошибок. Я доказал вышеупомянутый корректный алгоритм, но еще не протестировал его".
Некоторые люди не понимают вышеупомянутую кавычку (пересказ?), но это имеет смысл, когда Вы думаете об этом. Тесты никогда не будут доказывать корректный алгоритм, они только помогают указать, кодировали ли Вы его право. Могли бы появиться тесты записи на ошибки, которые Вы ожидаете, и чтобы граничные условия достигли хорошего покрытия кода. Только будьте значениями выбора внезапно, чтобы видеть, работают ли они, потому что это могло бы привести к большому количеству тестов который весь тест точно то же самое.
Для Вашего примера, просто ручной выбор несколько начал и неначал для тестирования особых условий в реализации.
Спросите себя. Что ТОЧНО делает я хочу протестировать. И протестируйте самое важное. Тест для проверки это в основном делает то, что Вы ожидаете, что это сделает в ожидаемых случаях.
При тестировании всех тех пустых указателей и пограничных случаев - я - не думаю, является реальным, слишком трудоемким, и кто-то должен поддержать это позже! И... Ваш тестовый код должен быть достаточно простым так, чтобы Вы не должны были тестировать свой тестовый код!
Если Вы хотите проверить, что Ваша функция правильно применила алгоритм, и работы в целом - вероятно, будут достаточно некоторые начала.
Если Вы хотите, доказывают, что метод для нахождения начал КОРРЕКТЕН - 100 000 начал не будут достаточно :) Но Вы не хотите тестировать последнего (вероятно)...
Только Вы знаете то, что Вы хотите протестировать!:)
PS я thnik, который использование циклов в модульных тестах не всегда неправильно, но я думал бы дважды прежде, чем сделать это. Тестовый код должен быть ОЧЕНЬ простым. Что, если что-то идет не так, как надо и существует ошибка в Вашем тесте????:) Однако необходимо стараться избегать дублирования тестового кода как регулярного дублирования кода. Кто-то должен поддержать тестовый код.
ЛЮДИ ПРОКОММЕНТИРУЙТЕ, ПОЧЕМУ ВЫ ДУМАЕТЕ, ЧТО ЭТО СТОИЛО ДВА DOWNVOTES :)
Несколько вопросов, ответы могут сообщить Вашему решению:
Править: Хм, так для уведомления в определенном сценарии. Так как Вы начали писать модульные тесты вчера, у Вас не могло бы быть опыта решить среди всех этих факторов. Позвольте мне помочь Вам:
Я протестировал бы 1, 2, 3, 21, 23, "большое" начало (5 цифр), "большое" неначало и 0, если Вы заботитесь о том, что это делает с 0.
Чтобы быть действительно уверенными, Вы оказываетесь перед необходимостью тестировать их всех.:-)
Серьезно, хотя, для этого вида функции Вы, вероятно, используете установленный и проверенный алгоритм. Главное, которое необходимо сделать, проверяют, что код правильно реализует алгоритм.
Другая вещь состоит в том, чтобы удостовериться, что Вы понимаете пределы своего представления числа, независимо от того, что это. По крайней мере это поместит верхний предел размера число, которое можно протестировать. Например, при использовании 32-разрядного неподписанного интервала Вы никогда не собираетесь быть способными протестировать значения, больше, чем 4G. Возможно Ваш предел будет ниже, чем это, в зависимости от деталей Вашей реализации.
Так же, как пример чего-то, что могло пойти не так, как надо с реализацией: простой алгоритм для тестирования начал должен попытаться делить кандидата на все известные начала до квадратного корня кандидата. Функция квадратного корня не обязательно даст точный результат, так для сейфа необходимо пойти немного мимо этого. Как далеко мимо зависел бы от конкретно, как функция квадратного корня реализована и насколько это могло быть выключено.
Другое примечание по тестированию: В дополнение к тестированию известных начал, чтобы видеть, идентифицирует ли Ваша функция правильно их как главных, также протестируйте известные составные числа, чтобы удостовериться, что Вы не получаете "ложные положительные стороны". Для проверки Вы разбираетесь в той вещи функции квадратного корня, выбираете некоторые составные числа, которые имеют простой множитель максимально близко к их квадратному корню.
Кроме того, рассмотрите, как Вы собираетесь "генерировать" свой список начал для тестирования. Можно ли положить что список, чтобы быть корректными? Как те числа были протестированы, и кого?
Вы могли бы рассмотреть кодирование двух функций и тестирование их друг против друга. Можно было быть простым, но медленным алгоритмом, который можно быть более уверены в том, что кодировали правильно, и другой более быстрый, но более сложный, который Вы действительно хотите использовать в своем приложении, но, более вероятно, будет иметь ошибку кодирования.
"Если это стоит создать, это стоит протестировать"
"Если это не стоит тестировать, почему Вы тратите впустую свое время, работая над ним?"
Я предполагаю, что Вы не подписывались для тестирования сначала, где Вы пишете тест перед написанием кода?
Для не волнения я уверен, что Вы не являетесь одними.
Как был сказан выше, протестируйте края, великолепное место для запуска. Также должен протестировать тяжелые случаи, если Вы только тестируете то, что Вы знаете работы, можно быть уверены, что тяжелый случай произойдет в производстве в худшее время.
О, и "я только что нашел последнюю ошибку" - HA HA.