29
junit #junit

junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

  • Upload
    others

  • View
    31

  • Download
    0

Embed Size (px)

Citation preview

Page 1: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

junit

#junit

Page 2: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

1

1: junit 2

2

2

Examples 2

3

3

@ 4

5

JUnit5 6

6

6

7

JUnit - 7

JUnit, : 7

2: Junit 9

9

Examples 9

Junit 9

3: 10

10

10

10

Examples 10

10

4: 12

12

Examples 12

@TestRule 12

@TestRule 13

5: 14

Page 3: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

14

Examples 14

14

15

6: Junit 16

16

Examples 16

Junit Eclipse 16

7: DataProviders 17

Examples 17

17

8: 19

19

Examples 19

JUnit 19

21

23

24

26

Page 4: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

ОколоYou can share this PDF with anyone you feel could benefit from it, downloaded the latest version from: junit

It is an unofficial and free junit ebook created for educational purposes. All the content is extracted from Stack Overflow Documentation, which is written by many hardworking individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official junit.

The content is released under Creative Commons BY-SA, and the list of contributors to each chapter are provided in the credits section at the end of this book. Images may be copyright of their respective owners unless otherwise specified. All trademarks and registered trademarks are the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/ru/home 1

Page 5: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 1: Начало работы с junit

замечания

JUnit - это простая структура для записи повторяющихся тестов для языка программирования Java . Это экземпляр архитектуры xUnit для модулей модульного тестирования.

Основные функции:

Утверждения , которые позволяют настраивать, как тестировать значения в ваших тестах

Тест-тестеры , которые позволяют указать, как выполнять тесты в своем классе•

Правила , которые позволяют гибко изменять поведение тестов в вашем классе•

Suites , которые позволяют вам объединить набор тестов из разных классов•

Полезное расширение для JUnit:

AssertJ : Свободные утверждения для java•

Mockito : Издевательская структура для java•

Версии

Версия Дата выхода

JUnit 5 Milestone 2 2016-07-23

JUnit 5 Milestone 1 2016-07-07

JUnit 4.12 2016-04-18

JUnit 4.11 2012-11-14

JUnit 4.10 2011-09-28

JUnit 4.9 2011-08-22

JUnit 4.8 2009-12-01

JUnit 4.7 2009-07-28

JUnit 4.6 2009-04-14

Examples

https://riptutorial.com/ru/home 2

Page 6: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

Установка или настройка

Поскольку JUnit является библиотекой Java, все, что вам нужно сделать, это установить несколько JAR-файлов в путь к классам вашего Java-проекта, и вы готовы к работе.

Вы можете загрузить эти два файла JAR вручную: junit.jar & hamcrest-core.jar .

Если вы используете Maven, вы можете просто добавить зависимость в свой pom.xml :

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>

Или, если вы используете Gradle, добавьте зависимость в свой build.gradle :

apply plugin: 'java' dependencies { testCompile 'junit:junit:4.12' }

После этого вы можете создать свой первый тестовый класс:

import static org.junit.Assert.assertEquals; import org.junit.Test; public class MyTest { @Test public void onePlusOneShouldBeTwo() { int sum = 1 + 1; assertEquals(2, sum); } }

и запустите его из командной строки:

Windows java -cp .;junit-X.YY.jar;hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest•Linux или OsX java -cp .:junit-X.YY.jar:hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest -cp java -cp .:junit-X.YY.jar:hamcrest-core-XYjar org.junit.runner.JUnitCore MyTest

или с mvn test Maven: mvn test

Пример базовой единицы измерения

Этот пример является базовой установкой для unittesting StringBuilder.toString () с использованием junit.

https://riptutorial.com/ru/home 3

Page 7: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

import static org.junit.Assert.assertEquals; import org.junit.Test; public class StringBuilderTest { @Test public void stringBuilderAppendShouldConcatinate() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("String"); stringBuilder.append("Builder"); stringBuilder.append("Test"); assertEquals("StringBuilderTest", stringBuilder.toString()); } }

@До после

Аннотированный метод с @Before будет выполняться перед каждым исполнением методов @Test . Аналогично @After аннотированный метод запускается после каждого метода @Test . Это можно использовать для многократной настройки теста и очистки после каждого теста. Таким образом, тесты независимы, и код подготовки не копируется внутри метода @Test .

Пример:

import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; public class DemoTest { private List<Integer> list; @Before public void setUp() { list = new ArrayList<>(); list.add(3); list.add(1); list.add(4); list.add(1); list.add(5); list.add(9); } @After public void tearDown() { list.clear(); }

https://riptutorial.com/ru/home 4

Page 8: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

@Test public void shouldBeOkToAlterTestData() { list.remove(0); // Remove first element of list. assertEquals(5, list.size()); // Size is down to five } @Test public void shouldBeIndependentOfOtherTests() { assertEquals(6, list.size()); } }

Методы, аннотированные с @Before или @After должны быть public void и с нулевыми аргументами.

Ловить ожидаемое исключение

Можно легко поймать исключение без какого-либо блока try catch .

public class ListTest { private final List<Object> list = new ArrayList<>(); @Test(expected = IndexOutOfBoundsException.class) public void testIndexOutOfBoundsException() { list.get(0); } }

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

Если вы хотите проверить информацию об исключении, вы можете использовать блок try / catch:

@Test public void testIndexOutOfBoundsException() { try { list.get(0); Assert.fail("Should throw IndexOutOfBoundException"); } catch (IndexOutOfBoundsException ex) { Assert.assertEquals("Index: 0, Size: 0", ex.getMessage()); } }

В этом примере вы должны знать, что всегда Assert.fail() добавлять Assert.fail() чтобы гарантировать, что тест будет неудачным, если не будет Assert.fail() Exception.

Для более сложных случаев JUnit имеет ExpectedException @Rule , который также может тестировать эту информацию и используется следующим образом:

public class SimpleExpectedExceptionTest { @Rule

https://riptutorial.com/ru/home 5

Page 9: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

public ExpectedException expectedException = ExpectedException.none(); @Test public void throwsNothing() { // no exception expected, none thrown: passes. } @Test public void throwsExceptionWithSpecificType() { expectedException.expect(NullPointerException.class); throw new NullPointerException(); } @Test public void throwsExceptionWithSpecificTypeAndMessage() { expectedException.expect(IllegalArgumentException.class); expectedException.expectMessage("Wanted a donut."); throw new IllegalArgumentException("Wanted a donut."); } }

Исключения в JUnit5

Чтобы достичь этого в JUnit 5, вы используете совершенно новый механизм :

Проверенный метод

public class Calculator { public double divide(double a, double b) { if (b == 0.0) { throw new IllegalArgumentException("Divider must not be 0"); } return a/b; } }

Метод испытания

public class CalculatorTest { @Test void triangularMinus5() { // The test method does not have to be public in JUnit5 Calculator calc = new Calculator(); IllegalArgumentException thrown = assertThrows( IllegalArgumentException.class, () -> calculator.divide(42.0, 0.0)); // If the exception has not been thrown, the above test has failed. // And now you may further inspect the returned exception... // ...e.g. like this: assertEquals("Divider must not be 0", thrown.getMessage());

https://riptutorial.com/ru/home 6

Page 10: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

}

Игнорирование тестов

Чтобы проигнорировать тест, просто добавьте аннотацию @Ignore к тесту и необязательно @Ignore параметр аннотации по этой причине.

@Ignore("Calculator add not implemented yet.") @Test public void testPlus() { assertEquals(5, calculator.add(2,3)); }

По сравнению с комментарием теста или удалением аннотации @Test , тестовый бегун все равно сообщит об этом тесте и отметит, что он был проигнорирован.

Также можно проигнорировать тестовый случай условно, используя предположения JUnit.

Пример использования прецедента состоял в том, чтобы запустить тестовый файл только после того, как разработчик установил определенную ошибку. Пример:

import org.junit.Assume; import org.junit.Assert; ... @Test public void testForBug1234() { Assume.assumeTrue(isBugFixed(1234));//will not run this test until the bug 1234 is fixed Assert.assertEquals(5, calculator.add(2,3)); }

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

JUnit - Основные примеры аннотаций

Вот некоторые основные аннотации JUnit, которые вы должны понимать:@BeforeClass – Run once before any of the test methods in the class, public static void @AfterClass – Run once after all the tests in the class has been run, public static void @Before – Run before @Test, public void @After – Run after @Test, public void @Test – This is the test method to run, public void

https://riptutorial.com/ru/home 7

Page 12: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 2: Игнорировать тестовые примеры в Junit

Вступление

Иногда вы хотите игнорировать некоторые из тестовых случаев, которые у вас есть в Junit.

Например, они частично выполнены, и вы хотите вернуться к ним позже.

Examples

Игнорировать тестовый пример в Junit

Перейдите к методу тестирования, который вы хотите игнорировать.1. Перед @Test аннотации, введите @Ignore2. Необязательно: вы можете добавить описание, почему вы игнорируете этот метод тестирования, например: @Ignore ("ignoring this test case for now")

3.

метод выборки:

@Ignore ("not going to test this method now") @Test public void test() { assertfalse(true); }

Прочитайте Игнорировать тестовые примеры в Junit онлайн: https://riptutorial.com/ru/junit/topic/8640/игнорировать-тестовые-примеры-в-junit

https://riptutorial.com/ru/home 9

Page 13: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 3: Параметрирование тестов

Вступление

Иногда у вас есть тест, который нужно запускать несколько раз, каждый раз с разными данными. Параметрирование теста позволяет сделать это простым и удобным способом.

Синтаксис

@RunWith (Parameterized.class) // аннотация для тестового класса

@ Параметры // аннотация для данных

замечания

Одно из преимуществ использования параметров заключается в том, что при сбое одного набора данных выполнение просто переходит к следующему набору данных, а не к остановке всего теста.

Examples

Использование конструктора

import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.is; import java.util.*; import org.junit.*; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class SimpleParmeterizedTest { @Parameters public static Collection<Object[]> data(){ return Arrays.asList(new Object[][]{ {5, false}, {6, true}, {8, true}, {11, false} }); } private int input; private boolean expected; public SimpleParmeterizedTest(int input, boolean expected){ this.input = input; this.expected = expected; }

https://riptutorial.com/ru/home 10

Page 14: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

@Test public void testIsEven(){ assertThat(isEven(input), is(expected)); } }

В data () вы указываете данные, которые будут использоваться в тестах. Junit будет перебирать данные и запускать тест с каждым набором данных.

Прочитайте Параметрирование тестов онлайн: https://riptutorial.com/ru/junit/topic/9425/

параметрирование-тестов

https://riptutorial.com/ru/home 11

Page 15: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 4: Пользовательские тестовые правила

замечания

Есть льготы для обоих. Расширение ExternalResource это удобно, особенно если нам требуется только before() чтобы установить что-то.

Тем не менее, мы должны знать, что, поскольку метод before() выполняется за пределами try...finally , любой код, который требуется очистить after() , не будет выполнен, если есть ошибка во время выполнение before() .

Вот как он выглядит внутри ExternalResource :

before(); try { base.evaluate(); } finally { after(); }

Очевидно, что если какое-либо исключение выбрано в самом тесте или другом вложенном правиле, то после этого все равно будет выполнено.

Examples

Пользовательский @TestRule по реализации

Это особенно полезно, если у нас есть класс, который мы хотим расширить в правиле. См. Пример ниже для более удобного метода.

import org.junit.rules.TestRule; import org.junit.runners.model.Statement; public class AwesomeTestRule implements TextRule { @Override public Statement apply(Statement base, Description description) { return new AwesomeStatement(base); } private static class AwesomeStatement extends Statement { private Statement base; public AwesomeStatement(Statement base) { this.base = base;

https://riptutorial.com/ru/home 12

Page 16: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

} @Override public void evaluate() throws Throwable { try { // do your magic base.evaluate(); // this will call Junit to run an individual test } finally { // undo the magic, if required } } } }

Пользовательский @TestRule по расширению

JUnit имеет абстрактную реализацию @TestRule которая позволяет вам писать правило более простым способом. Это называется ExternalResource и предоставляет два защищенных метода, которые могут быть расширены следующим образом:

public class AwesomeTestRule extends ExternalResource { @Override protected void before() { // do your magic } @Override protected void after() { // undo your magic, if needed } }

Прочитайте Пользовательские тестовые правила онлайн: https://riptutorial.com/ru/junit/topic/9808/пользовательские-тестовые-правила

https://riptutorial.com/ru/home 13

Page 17: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 5: Порядок выполнения тестирования

Синтаксис

@FixMethodOrder // запускает тест с использованием сортировщика по умолчанию•

@FixMethodOrder (MethodSorters) // запускает тест с использованием метода MethodSorter, связанного с перечислением MethodSorters.

Examples

Заказ по умолчанию

Используйте аннотацию - @FixMethodOrder(MethodSorters.DEFAULT) . Это выполняет все тесты внутри класса в детерминированном и несколько предсказуемом порядке. Реализация хеширует имена методов и сравнивает их. В сценарии галстука он сортируется по лексикографическому порядку.

Сегмент кода ниже, взятый из JUnit Github - MethodSorter.java

public int compare(Method m1, Method m2) { int i1 = m1.getName().hashCode(); int i2 = m2.getName().hashCode(); if(i1 != i2) { return i1 < i2 ? -1 : 1; } return NAME_ASCENDING.compare(m1,m2); }

пример

@FixMethodOrder(MethodSorters.DEFAULT) public class OrderedTest { @Test public void testA() {} @Test public void testB() {} @Test public void testC() {} }

Предположим, что хеши для testA , testB и testC равны 3, 2 и 1 соответственно. Тогда порядок выполнения

https://riptutorial.com/ru/home 14

Page 18: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

testC1. testB2. панцирь3.

Предположим, что хэши для всех тестов одинаковы. Поскольку все хэши одинаковы, порядок выполнения основан на лексикографическом порядке. Порядок выполнения

панцирь1. testB2. testC3.

Лексикографический заказ

Используйте аннотацию @FixMethodOrder с помощью сортировщика MethodSorters.NAME_ASCENDING . Это проведет все тесты внутри класса в детерминированном и предсказуемом порядке. Реализация сравнивает имена методов, а в случае привязки сравнивает методы toString() .

Сегмент кода ниже, взятый из JUnit Github - MethodSorter.java

public int compare(Method m1, Method m2) { final int comparison = m1.getName().compareTo(m2.getName()); if(comparison != 0) { return comparison; } return m1.toString().compareTo(m2.toString()); }

пример

@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class OrderedTest { @Test public void testA() {} @Test public void testB() {} @Test public void testC() {} }

Порядок выполнения

панцирь1. testB2. testC3.

Прочитайте Порядок выполнения тестирования онлайн: https://riptutorial.com/ru/junit/topic/5905/порядок-выполнения-тестирования

https://riptutorial.com/ru/home 15

Page 19: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 6: Сгенерируйте скелет тестовых случаев Junit для существующего кода

Вступление

Иногда вам нужно сгенерировать скелет для тестовых случаев на основе классов, которые у вас есть в вашем проекте.

Examples

Сгенерируйте скелет тестовых случаев Junit для существующего кода в Eclipse

Ниже приведены шаги для генерации тестового скелета для существующего кода:

Откройте Eclipse и выберите проект, который вы хотите создать для1.

В Проводнике пакетов выберите класс java, который вы хотите сгенерировать тест Junit для

2.

Перейти к файлу -> Новое -> Случаи тестирования Junit3.

Измените папку «Источник», чтобы указать на тест, используя «Обзор» (Примечание: лучше отделить исходный код от тестового кода)

4.

Измените пакет на основе требуемого пакета5. В тестируемом классе убедитесь, что вы вводите класс, для которого вы хотите сгенерировать тестовые примеры.

6.

Нажмите « Далее»7. Выберите методы, которые вы хотите проверить для8. Нажмите Готово9.

Теперь у вас будет класс Junit, сгенерированный для тестирования исходного класса, который у вас есть.

Прочитайте Сгенерируйте скелет тестовых случаев Junit для существующего кода онлайн: https://riptutorial.com/ru/junit/topic/8648/сгенерируйте-скелет-тестовых-случаев-junit-для-существующего-кода

https://riptutorial.com/ru/home 16

Page 20: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 7: Тестирование с помощью DataProviders

Examples

Установка и использование

Монтаж:

Чтобы использовать DataProviders, вам нужен junit-dataprovider .jar:

Github

Прямое скачивание

Hamcrest-core-1.3.jar:

Github

Прямое скачивание

И добавьте оба этих .jar в свой проект.

Использование:

Добавьте этот import в свой код:

import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider;

Перед объявлением вашего класса:

@RunWith(DataProviderRunner.class)

Так выглядит:

@RunWith(DataProviderRunner.class) public class example { //code }

Как создать DataProviders:

Прежде чем вы хотите, чтобы он был DataProvider, добавьте этот декоратор:

https://riptutorial.com/ru/home 17

Page 21: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

@DataProvider

Таким образом, это будет выглядеть так:

@DataProvider public static Object[][] testExampleProvider() { return new Object[][]{ {"param1", "param2", number1} {"param1", "param2", number1} //You can put as many parameters as you want }; }

Как использовать DataProviders:

Перед любой функцией вы хотите получить те параметры, которые мы возвращаем из DataProvider, добавьте этот декоратор:

@UseDataProvider("testExampleProvider")

Таким образом, ваша функция проверки выглядит так:

@Test @UseDataProvider("testExampleProvider") public void testAccount(String param1, String param2, int number) { //System.out.println("exampleOfDataProviders"); //assertEquals(...); //assertEquals(...); }

Прочитайте Тестирование с помощью DataProviders онлайн: https://riptutorial.com/ru/junit/topic/7469/тестирование-с-помощью-dataproviders

https://riptutorial.com/ru/home 18

Page 22: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

глава 8: тесты

замечания

параметр контекст подробности

@BeforeClass статический Выполняется, когда класс сначала создается

@До Пример Выполнено перед каждым тестом в классе

@Тестовое задание

ПримерДолжен быть объявлен каждый метод тестирования

@После Пример Выполняется после каждого теста в классе

@После школы статический Выполнено до уничтожения класса

Пример Формат тестового класса

public class TestFeatureA { @BeforeClass public static void setupClass() {} @Before public void setupTest() {} @Test public void testA() {} @Test public void testB() {} @After public void tearDownTest() {} @AfterClass public static void tearDownClass() {} } }

Examples

Единичное тестирование с использованием JUnit

Здесь у нас есть класс Counter с методами countNumbers() и hasNumbers() .

https://riptutorial.com/ru/home 19

Page 23: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

public class Counter { /* To count the numbers in the input */ public static int countNumbers(String input) { int count = 0; for (char letter : input.toCharArray()) { if (Character.isDigit(letter)) count++; } return count; } /* To check whether the input has number*/ public static boolean hasNumber(String input) { return input.matches(".*\\d.*"); } }

Для тестирования этого класса мы можем использовать структуру Junit. Добавьте junit.jar в свой путь к проекту. Затем создайте класс Test case, как показано ниже:

import org.junit.Assert; // imports from the junit.jar import org.junit.Test; public class CounterTest { @Test // Test annotation makes this method as a test case public void countNumbersTest() { int expectedCount = 3; int actualCount = Counter.countNumbers("Hi 123"); Assert.assertEquals(expectedCount, actualCount); //compares expected and actual value } @Test public void hasNumberTest() { boolean expectedValue = false; boolean actualValue = Counter.hasNumber("Hi there!"); Assert.assertEquals(expectedValue, actualValue); } }

В вашей среде IDE вы можете запустить этот класс как «тестовый тест Junit» и посмотреть результат в графическом интерфейсе. В командной строке вы можете скомпилировать и запустить тестовый пример, как показано ниже:

\> javac -cp ,;junit.jar CounterTest.java \> java -cp .;junit.jar org.junit.runner.JUnitCore CounterTest

Результат успешного тестового прогона должен выглядеть так:

JUnit version 4.9b2 .. Time: 0.019 OK (2 tests)

https://riptutorial.com/ru/home 20

Page 24: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

В случае отказа теста он будет больше похож:

Time: 0.024 There was 1 failure: 1) CountNumbersTest(CounterTest) java.lang.AssertionError: expected:<30> but was:<3> ... // truncated output FAILURES!!! Tests run: 2, Failures: 1

арматура

Из Википедии :

Прибор для тестирования - это то, что используется для постоянного тестирования какого-либо элемента, устройства или части программного обеспечения.

Он также может повысить читаемость тестов путем извлечения общего кода инициализации / окончательной обработки из самих методов тестирования.

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

Пример, приведенный ниже, изобретен, чтобы показать основные параметры, предоставленные JUnit. Предположим, что класс Foo который дорого инициализируется:

public class Foo { public Foo() { // expensive initialization } public void cleanUp() { // cleans up resources } }

В еще одном классе Bar есть ссылка на Foo :

public class Bar { private Foo foo; public Bar(Foo foo) { this.foo = foo; } public void cleanUp() { // cleans up resources } }

В приведенных ниже тестах ожидаются исходный контекст списка, содержащего один Bar .

https://riptutorial.com/ru/home 21

Page 25: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.List; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; public class FixturesTest { private static Foo referenceFoo; private List<Bar> testContext; @BeforeClass public static void setupOnce() { // Called once before any tests have run referenceFoo = new Foo(); } @Before public void setup() { // Called before each test is run testContext = Arrays.asList(new Bar(referenceFoo)); } @Test public void testSingle() { assertEquals("Wrong test context size", 1, testContext.size()); Bar baz = testContext.get(0); assertEquals(referenceFoo, baz.getFoo()); } @Test public void testMultiple() { testContext.add(new Bar(referenceFoo)); assertEquals("Wrong test context size", 2, testContext.size()); for (Bar baz : testContext) { assertEquals(referenceFoo, baz.getFoo()); } } @After public void tearDown() { // Called after each test is run for (Bar baz : testContext) { baz.cleanUp(); } } @AfterClass public void tearDownOnce() { // Called once after all tests have run referenceFoo.cleanUp(); } }

https://riptutorial.com/ru/home 22

Page 26: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

В примере @BeforeClass аннотированный метод setupOnce() используется для создания Foo объекта, который является дорогим инициализацию. Важно, чтобы он не изменялся ни одним из тестов, иначе результат тестового прогона мог зависеть от порядка выполнения отдельных тестов. Идея состоит в том, что каждый тест независим и проверяет одну небольшую функцию.

Функция @Before setup() аннотированного метода setup() устанавливает тестовый контекст. Контекст может быть изменен во время выполнения теста, поэтому он должен быть инициализирован перед каждым тестом. Эквивалентный эффект может быть достигнут путем включения кода, содержащегося в этом методе, в начале каждого тестового метода.

@After аннотированный метод tearDown() очищает ресурсы в контексте теста. Он вызывается после каждого вызова вызова и как таковой часто используется для освобождения ресурсов, выделенных в @Before annotated.

@AfterClass аннотированный метод tearDownOnce() очищает ресурсы , как только все тесты выполняются. Такие методы обычно используются для освобождения ресурсов, выделенных во время инициализации или в аннотированном методе @BeforeClass . Тем не менее, вероятно, лучше избегать внешних ресурсов в модульных тестах, чтобы тесты не зависели ни от чего за пределами тестового класса.

Единичное тестирование с использованием теорий

Из JavaDoc

Бегун Theories позволяет протестировать определенную функциональность против подмножества бесконечного набора точек данных.

Запуск теории

import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; @RunWith(Theories.class) public class FixturesTest { @Theory public void theory(){ //...some asserts } }

Методы, аннотированные с помощью @Theory будут читаться как теории на языке Theories.

Аннотация @DataPoint

@RunWith(Theories.class) public class FixturesTest {

https://riptutorial.com/ru/home 23

Page 27: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

@DataPoint public static String dataPoint1 = "str1"; @DataPoint public static String dataPoint2 = "str2"; @DataPoint public static int intDataPoint = 2; @Theory public void theoryMethod(String dataPoint, int intData){ //...some asserts } }

Каждое поле, аннотированное с помощью @DataPoint будет использоваться в качестве параметра метода данного типа в теориях. В примере выше theoryMethod будет работать два раза со следующими параметрами: ["str1", 2] , ["str2", 2]

@DataPoints аннотация @RunWith (Theories.class) public class FixturesTest {

@DataPoints public static String[] dataPoints = new String[]{"str1", "str2"}; @DataPoints public static int[] dataPoints = new int[]{1, 2}; @Theory public void theoryMethod(String dataPoint, ){ //...some asserts } }

Каждый элемент массива, аннотированный аннотацией @DataPoints будет использоваться в качестве параметра метода данного типа в теориях. В примере выше theoryMethod будет работать четыре раза со следующими параметрами: ["str1", 1], ["str2", 1], ["str1", 2], ["str2", 2]

Измерение производительности

Если вам нужно проверить, требуется ли слишком много времени для выполнения метода тестирования, вы можете сделать это, указав ожидаемое время выполнения, используя свойство timeout аннотации @Test. Если выполнение теста занимает больше времени, чем миллисекунды, это приводит к сбою тестового метода.

public class StringConcatenationTest { private static final int TIMES = 10_000; // timeout in milliseconds @Test(timeout = 20) public void testString(){ String res = "";

https://riptutorial.com/ru/home 24

Page 28: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

for (int i = 0; i < TIMES; i++) { res += i; } System.out.println(res.length()); } @Test(timeout = 20) public void testStringBuilder(){ StringBuilder res = new StringBuilder(); for (int i = 0; i < TIMES; i++) { res.append(i); } System.out.println(res.length()); } @Test(timeout = 20) public void testStringBuffer(){ StringBuffer res = new StringBufferr(); for (int i = 0; i < TIMES; i++) { res.append(i); } System.out.println(res.length()); } }

В большинстве случаев без testString JVM testString не удастся. Но testStringBuffer и testStringBuilder должны успешно пройти этот тест.

Прочитайте тесты онлайн: https://riptutorial.com/ru/junit/topic/5414/тесты

https://riptutorial.com/ru/home 25

Page 29: junit - RIP Tutorial• Mockito : Издевательская структура для java Версии Версия Дата выхода JUnit 5 Milestone 2 2016-07-23 JUnit 5

кредиты

S. No

Главы Contributors

1Начало работы с junit

acdcjunior, Andrii Abramov, Ashish Bhavsar, cheffe, Community, Daniel Käfer, Honza Zidek, Lachezar Balev, NamshubWriter, nishizawa23, Roland Weisleder, Rufi, Simulant, Squidward, svgameren, t0mppa, Tim Tong, Tomasz Bawor

2Игнорировать тестовые примеры в Junit

Hamzawey

3Параметрирование тестов

Hai Vu, selotape, user7491506

4Пользовательские тестовые правила

pablisco

5Порядок выполнения тестирования

Tim Tong

6

Сгенерируйте скелет тестовых случаев Junit для существующего кода

Hamzawey

7Тестирование с помощью DataProviders

Manuel

8 тесты Andrii Abramov, gar, Ram, Robert, Sergii Bishyr, Squidward

https://riptutorial.com/ru/home 26