Як працює Junit @Rule?


195

Я хочу написати тестові випадки для більшої частини коду, я хотів би знати деталі функції @Ruleанотації JUnit , щоб я міг використовувати її для написання тестових випадків. Надайте кілька хороших відповідей або посилань, де детально описується його функціональність на простому прикладі.


Я вже перейшов за цим посиланням http://cwd.dhemery.com/2011/01/what-junit-rules-are-good-for/
Dipak

Я вважаю, що ця стаття пояснює @Ruleдосить добре, особливо перегляньте останній розділ "Послідовність подій у деталях"
Петро Перхач

Я думаю, що це схоже на поняття ін'єкції, я прав?
Чао

Дякуємо, що поділилися цим посиланням. Одне не зрозуміло. Коли викликається виписка DEFAULT.evaluate ()? Чи називається він перед оцінкою () всіх правил або після них? Я здогадуюсь після всіх них.
MasterJoe2

@ testerjoe2 ви можете повністю проігнорувати заяву за замовчуванням. Ви можете вирішити делегувати його або просто просто замінити його іншим власним повідомленням. Це не додзвонилися , ви можете назвати це чи ні. Це було в пункті 10: "Спосіб скріншотування оператора (() оператора скріншоту викликає метод оцінки () оператора за замовчуванням."
Пітер Пергач

Відповіді:


156

Правила використовуються для додавання додаткової функціональності, яка застосовується до всіх тестів у тестовому класі, але більш загальним чином.

Наприклад, ExternalResource виконує код до і після методу тестування, не використовуючи @Beforeі @After. Використання, ExternalResourceа не, @Beforeі @Afterдає можливості для кращого використання коду; те саме правило можна використовувати для двох різних тестових класів.

В основі проекту лежали: Перехоплювачі в JUnit

Для отримання додаткової інформації див. Вікі JUnit: Правила .


1
Виправлення: "Наприклад, ExternalResource виконує код до і після тестового класу ." Існує щось про використання Apply (), щоб змусити ExternalResource працювати між тестами.
дерекем

62

Правила Junit працюють за принципом AOP (аспект-орієнтоване програмування). Він перехоплює метод тестування, таким чином надаючи можливість робити якісь речі до або після виконання певного методу тестування.

Візьмемо для прикладу наведений нижче код:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Щоразу, коли описаний вище метод тестування створюється тимчасова папка, яка видаляється після виконання методу. Це приклад правила про нестандартність, наданого Джунітом.

Подібної поведінки можна досягти і шляхом створення власних правил. Junit надає інтерфейс TestRule, який можна реалізувати для створення власного правила Junit.

Ось корисне посилання для довідки:


4
тож видаляється без написання коду для видалення / очищення об'єкта?
Dror

подивіться на джерело github.com/junit-team/junit4/blob/master/src/main/java/org/… , папка створюється методом зворотного виклику до () та видаляється у методі зворотного виклику after (). ..
П’єрлуіджі Вернетто

1
Для людей, які, можливо, не зрозуміли, чому тимчасовий папку видаляється, це тому, що тимчасовий папка, яку надає Junit, слугує тимчасовою папкою, яка автоматично видаляється - тобто крок відстеження є частиною самого класу тимчасової папки.
Міндоўг Бернатавічус

18

Пояснення, як це працює:

JUnit загортає ваш метод тестування в об’єкт Statement, таким чином, заяву і Execute()запускає ваш тест. Тоді замість того, щоб закликати statement.Execute()безпосередньо запустити тест, JUnit передає Звіт до TestRule з @Ruleанотацією. Функція «застосувати» TestRule повертає нову заяву, надану Виписку з вашим тестом. Метод нової операції Execute()може викликати метод виконання (або ні) або викликати його кілька разів, і робити все, що завгодно before and after.

Тепер у JUnit є нова заява, яка робить більше, ніж просто запускати тест, і він знову може передати це будь-яким правилам, перш ніж остаточно викликати Execute.


2
Заява має метод оцінки не виконувати.
Хемант

0

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

Наприклад, використовуючи правило @Timeout, ми можемо встановити тайм-аут для всіх тестів.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

Правило @TemporaryFolder використовується для створення тимчасових папок, файлів. Щоразу, коли виконується метод тестування, створюється тимчасова папка, яка видаляється після виконання методу.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

Ви можете побачити приклади деяких вбудованих правил, які надає junit, за цим посиланням .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.