Рулы рулят!

Почти во всех статьях о написании приёмочных тестов с использованием junit, встречается упоминание аннотаций @Before, @BeforeClass, @After и @AfterClass. Использование отдельных методов с этими аннотациями для инициализации тестов и очистки окружения после их выполнения - практика хорошая, но уже устаревшая.

Рулы появились в junit достаточно давно (начиная с версии 4.7) и представляют собой эволюцию setup-teardown методов. Рула представляет собой класс, который следит за выполнением теста и может реагировать на изменение его состояния - старт, окончание, успешное и неуспешное прохождение и даже пропуск теста. Для каждого из состояний у рулы есть соответствующий метод:

public class LoginRule extends TestWatcher {
    @Override
    protected void starting(Description description) {
        // Doing some stuff to login user
    }

    @Override
    protected void finished(Description description) {
        // When test finished, we can logout user
    }

    @Override
    protected void succeeded(Description description) {
        // Celebrate the succeeded test
    }

    @Override
    protected void failed(Throwable e, Description description) {
        // Invoked when a test fails
    }

    @Override
    protected void skipped(AssumptionViolatedException e, Description description) {
        // Invoked when a test is skipped due to a failed assumtion
    }
}

Имея такой набор, мы можем полностью контролировать состояние теста. Например, выполнять очистку окружения только в случае неудачного прохождения (такого удобства при использовании старых setup-teardown методов ты не добъёшься без костылей). Естесственно, рулы позволяют очень удобно и прозрачно переиспользовать код - достаточно добавить соответствующую рулу в твой тестовый класс:

public class PersonalInfo {
    public static WebDriver driver = new FirefoxDriver();

    @ClassRule
    // рула, которая будет следить за webdriver'ом
    public static ManageDriverRule mdr = new ManageDriverRule(driver);

    @Rule
    // рула, которая будет выполнять авторизацию
    public LoginRule login = new LoginRule(driver);

    @Test
    public void userShouldSeePersonalInfoAfterLogin() {
        user.shouldSeeOwnName();
        user.shouldSeeOwnAge();
        user.ShouldSeeOwnPhone();
    }
}

Аннотации @Rule и @ClassRule определяют, будет ли рула применена для каждого теста в классе или один раз для всего класса (по аналогии с @Before и @BeforeClass). А используя класс RuleChain, ты можешь выстраивать цепочки рул в нужной тебе последовательности.

comments powered by Disqus