Чтобы дать немного надуманный пример, скажем, я хочу проверить, что функция возвращает два числа, а первое меньше второго:
def test_length():
result = my_function()
assert len(result) == 2
def test_order()
a, b = my_function()
assert a < b
Здесь, если test_length
не test_order
получится , то тоже не получится. Лучше написать test_length
или пропустить?
РЕДАКТИРОВАТЬ: обратите внимание, что в этой ситуации оба теста в основном независимы друг от друга, каждый может быть запущен в отдельности, или они могут быть запущены в обратном порядке, это не имеет значения. Так что ни один из этих бывших вопросов
- Как я должен проверить функциональность функции, которая использует в ней другие функции?
- Нужен ли мне модульный тест, если у меня уже есть интеграционный тест?
- Как структурировать тесты, где один тест является настройкой другого теста?
- Как управлять зависимостью успеха между юнит-тестами
является дубликатом вышеупомянутого.
unit-testing
Михай
источник
источник
A
вызываютB
и возвращают один и тот же результат, вы должны проверить обаA
иB
». Это больше о тестах, которые перекрываются, а не о тестируемых функциях. (Хотя это сбивает с толку, как они в настоящее время названы).lambda: type('', (), {'__len__': lambda self: 2})()
пройдет первое, но не второе.Ответы:
Там может быть ценность, но это немного запах. Либо ваши тесты недостаточно хорошо изолированы (поскольку на
test_order
самом деле тестируют две вещи), либо вы слишком догматичны в своем тестировании (проводите два теста, проверяющих одну и ту же логическую вещь).В этом примере я бы объединил два теста вместе. Да, это означает, что у вас есть несколько утверждений. Печалька. Вы все еще тестируете одну вещь - результат функции. Иногда в реальном мире это означает две проверки.
источник
my_function
не вернет ровно два значения, без какого-либо утверждения - потому что назначение приведет к исключению. Таким образом, на самом деле нет необходимости использовать несколько утверждений и две проверки для проверки одного и того же.Ваши тесты должны быть явными. Это не совсем вывод, что если text_length терпит неудачу, test_order терпит неудачу.
Я не уверен, как обстоят дела в Python, который вы опубликовали, но если
len(result)
3, то первое не получится, но второе может пройти (и если не в Python, то в таких языках, как JavaScript, конечно).Как вы сказали, вы хотите проверить, что функция возвращает два числа и что они в порядке. Два теста это так.
источник
It's not completely inferred that if text_length fails test_order fails
- в Python это даст вам исключение.test_length
подразумевает отказtest_order
. Тот факт, что подобная пара тестов, написанных на Javascript, не будет вести себя так же, как эти два теста на python, не имеет никакого значения.Единственное значение
test_length
здесь состоит в том, что, если все проходит, само его присутствие указывает, что «длина» была проверена.Так что на самом деле нет необходимости иметь оба этих теста. Оставьте только,
test_order
но подумайте о переименованииtest_length_and_order
.Между прочим, я нахожу использование имен, которые начинаются
test
немного неуклюже. Я решительный сторонник имен тестов, которые на самом деле описывают условие, которое вы утверждаете.источник
test
Бородавка имеет смысл тестовой структуры Python. Что, конечно, не должно меняться, если вы фанат этого, но это меняет вес аргумента, необходимого, чтобы остановить кого-то, использующего его ;-)test_that_
, какtest_that_return_values_are_in_order
и так далее. Возможно, будущая версия тестового фреймворка как-то обойдет это требование.Я бы оставил эти тесты отдельно, если бы они так развивались. Да
test_order
, скорее всего, потерпит неудачуtest_length
, но вы определенно знаете, почему.Я также согласен с тем, что, если он
test_order
появился первым, и вы обнаружили, что тестируемый сбой состоял в том, что результатом, возможно, были не два значения, добавьте эту проверку какassert
и переименуйте тест, чтобы иметьtest_length_and_order
смысл.Если бы вам также нужно было проверить, чтобы типы возвращаемых значений были целыми числами, я бы включил это в этот «сводный» тест результатов.
Но обратите внимание, теперь у вас есть батарея тестов на результат
my_function()
. Если есть несколько контекстов (или, что более вероятно, несколько параметров) для проверки, теперь это может быть подпрограмма для проверки всех результатовmy_function()
.Однако, когда я пишу модульные тесты, я обычно тестирую граничные и плохие случаи отдельно от хорошего ввода и нормального вывода (отчасти потому, что большинство моих «модульных» тестов часто являются мини-интеграционными тестами) и часто с несколькими утверждениями, которые только нарушаются в отдельные тесты, если они терпят неудачу способами, где я нахожу, что я хочу больше информации без отладки.
Поэтому я бы, вероятно, начал с ваших отдельных тестов, а затем расширил
test_length
быtest_length_and_types
и оставилtest_order
отдельные, предполагая, что последний считается "нормальной обработкой".источник