Существует определенное количество соглашений об именах, используемых для модульных тестов. В начале, с JUnit 3, для определения теста было обязательно, чтобы имя класса было названо как MyClassTest, начиная с TestCase, и все имена методов теста начинались с ‘test’, как в ‘testMyMethod ()’. Я думаю, что это хороший пример соглашения о конфигурации.
В JUnit 4 (или TestNG) это больше не является обязательным, и разработчик может самостоятельно определять свое соглашение об именах. Но затем вы «настраиваете» метод как тест, используя аннотацию @Test.
Существует соглашение об именах, определенное BDD, которое говорит, что класс теста и методы теста должны описывать поведение, которое вы хотите проверить.
Примеры:
имея методы испытаний, начинающиеся с
public class WhenWindowControlCloseWindow {
@Test
public void shouldCloseWindows() {
//...
}
}
Или как в этом примере (из Википедии ), который также использует комментарии для описания теста: дано / когда / тогда:
public class WindowControlBehavior {
@Test
public void shouldCloseWindows() {
// Given
WindowControl control = new WindowControl("My AFrame");
AFrame frame = new AFrame();
// When
control.closeWindow();
// Then
ensureThat(!frame.isShowing());
}
}
или другое соглашение, которое я видел:
public class WindowControlShould {
@Test
public void closeWindows() {
//...
}
}
Проблема здесь в том, что у вас есть 3 элемента в тесте: субъект «субъекта» теста (обычно имя класса), условие («при вызове некоторого метода с некоторыми конкретными параметрами) и ожидаемый результат, который, как мы видел в BDD с именем метода « следует делать». Так что проблема в том, что с именем класса и именем метода у нас есть только два элемента для описания нашего теста.
Чтобы выразить 3-ю «сущность» фразы, я попытался использовать внутренние классы для определения таких тестов:
public class WindowControl
public static class WhenCloseWindow {
@Test
public void shouldCloseWindows() {
//...
}
}
}
Но это не поддерживается JUnit4.
Я думал, что пакеты могут помочь, например, указав их как
package com.mycompany.blah.blah.windowcontrol;
public static class WhenCloseWindow {
@Test
public void shouldCloseWindows() {
//...
}
}
Но таким образом вы теряете возможность вызывать стандартные и упаковывать доступные методы, что мне очень нравится в моих тестах.
Теперь я чувствую, что сначала методы испытаний были определены соглашением об именах. Затем с аннотацией, соглашение оставлено на усмотрение разработчика, или даже на выбор вообще не иметь соглашения. Для меня аннотация ближе к конфигурации, которая заменяет соглашение; своего рода контр-тенденция в тенденции соглашения по конфигурации конфигурации. Так что, если мы начнем вызывать наш тестовый метод, следует ли Something () не вернуться к старому соглашению test Something ()?
Ну, мне понравились соглашения, использованные в JUnit 3, и я не вижу больших улучшений в использовании аннотаций или свободе от расширения класса TestCase, который предоставлял assert* методы: с помощью JUnit4 мы должны статически импортировать эти методы из класса Assert; Я не вижу в этом улучшения.
Мой вкус таков: если мы не можем легко найти описательное соглашение о присвоении имен для того, что мы тестируем, лучше всего полагаться на некоторые комментарии. В приведенном выше примере, взятом из Википедии, фактически используется соглашение об именах и некоторые комментарии в коде. Я думаю, что использование комментария поверх метода лучше послужило бы описанию теста.
Наконец, некоторые инструменты непрерывной интеграции могут форматировать имена тестов (класс + метод), чтобы показать предложение, описывающее тест, красиво на естественном английском языке.
Это круто, но поскольку у нас уже есть аннотация @Test для настройки теста, почему бы не иметь описательный атрибут, который можно использовать из инструментов отчетности, таких как:
@Test(description="when WindowController.closeWindow() is invoked the window is closed")
public void testCloseWindow() {
//...
}
Или, так как я критиковал аннотацию @Test, короткий Java-комментарий сортировал бы ту же цель для инструментов, желающих описать тест простым английским описанием.
Поскольку нет действительно хорошего соглашения об именах для тестов, так как я не вижу реальных улучшений с использованием аннотаций и статического импорта … Я думаю, что JUnit 3 работал правильно.
Что вы думаете?
От http://en.newinstance.it/2011/01/28/unit-test-naming-conventions/