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

map создает новый список, применяя функцию к каждому элементу источника:

xs = [1, 2, 3]

# all of those are equivalent — the output is [2, 4, 6]
# 1. map
ys = map(lambda x: x * 2, xs)
# 2. list comprehension
ys = [x * 2 for x in xs]
# 3. explicit loop
ys = []
for x in xs:
    ys.append(x * 2)

n-ary map эквивалентно объединению повторяющихся итераций ввода, а затем применение функции преобразования на каждый элемент этого промежуточного списка. Это не декартово произведение:

xs = [1, 2, 3]
ys = [2, 4, 6]

def f(x, y):
    return (x * 2, y // 2)

# output: [(2, 1), (4, 2), (6, 3)]
# 1. map
zs = map(f, xs, ys)
# 2. list comp
zs = [f(x, y) for x, y in zip(xs, ys)]
# 3. explicit loop
zs = []
for x, y in zip(xs, ys):
    zs.append(f(x, y))

Здесь я использовал zip, но поведение map на самом деле немного отличается, когда итераторы не имеют одинаковый размер - как отмечено в его документации, оно расширяет итерации, чтобы содержать None.

6
задан James A. Rosen 23 August 2008 в 20:02
поделиться

5 ответов

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

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

10
ответ дан 8 December 2019 в 13:51
поделиться

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

1
ответ дан 8 December 2019 в 13:51
поделиться

@Keith

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

0
ответ дан 8 December 2019 в 13:51
поделиться

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

100%-е покрытие не означает, что определенно соответственно тестируется, но это - хороший индикатор.

Для довольно хорошего NCover's .NET, но больше не открытый исходный код.


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

0
ответ дан 8 December 2019 в 13:51
поделиться

Как Вы знаете, когда Вы 'сделаны', получив тестовые сценарии?

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

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

Выборка из Искусства Тестирования программного обеспечения Glenford J. Myers:

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

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

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

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

Это более трудно, чем это смотрит. Myers предлагает этот тест:

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

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

Запишите свои тестовые сценарии. Сколько Вы имеете? Myers задает 14 вопросов о Вашем наборе тестов и сообщает что высококвалифицированное профессиональное среднее число программ 7.8 из возможных 14.

6
ответ дан 8 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: