2013-04-26 2 views
1

Я пишу модульные тесты для python некоторое время, используя py.test (который, кстати, я рекомендую).Тесты JUnit для неудачных случаев

Теперь я делаю это на java, используя JUnit4. Интересное о модульном тестировании - это проверка того, как работает код, когда не все идет так, как ожидалось (неожиданные данные, возвращаемые веб-сервисом, недопустимые входные данные ...), на python у меня было два теста на каждую функцию.

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

Обычно я называю их test_foo() и test_foo_ko(), конечно, java будет использовать camelCase.

Вопрос в том, должен ли я сконцентрировать все случаи на кусок кода в одном тесте, должен ли я разделить их пополам, как я это делал на python, или мне нужно сделать тест для каждого случая ?

ответ

2

Я принял шаблон именования «methodName_stateUnderTest_ExpectedBehavior». Я использую символы подчеркивания в именах тестов для лучшей читаемости (IMO).

@Test(expected=IllegalArgumentException.class) 
public void sum_negativeNumberAs1stParam_ExceptionThrown(){ 
    //... 
} 

Эта политика именования также подразумевает, что я пишу один тест для каждого случая кромки.

Я также не префикс моих имен методов с помощью «теста». Это было требование, когда JUnit не поддерживал аннотации в прошлом, но в настоящее время это не имеет значения (учитывая, что вы используете JUnit 4).

+0

+1 Для того, чтобы дать мне повод разбить соглашение camelCase, которое на самом деле имеет смысл :) –

0

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

Конечно, вы можете сделать это сами с большим количеством протоколирования, но зачем беспокоиться, когда вы можете просто поместить его в имя метода.

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

Редактировать: Другая причина, по которой вам могут понадобиться отдельные тесты: вы можете использовать JUnit для успешного выполнения тестов, если выбрано конкретное исключение - полезно для случаев сбоя, поэтому вам не нужно возиться с try/блоки блокировки.

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