Espresso Testing Framework - Обзор JUnit
В этой главе давайте разберемся с основами JUnit , популярной среды модульного тестирования, разработанной сообществом Java, на которой построена среда тестирования эспрессо.
JUnit является стандартом де-факто для модульного тестирования Java-приложений. Несмотря на то, что он популярен для модульного тестирования, он также имеет полную поддержку и возможности для инструментального тестирования. Библиотека тестирования Espresso расширяет необходимые классы JUnit для поддержки инструментального тестирования на базе Android.
Напишите простой модульный тест
Давайте создадим Java-класс Computation (Computation.java) и напишем простую математическую операцию суммирования и умножения . Затем мы напишем тестовые примеры с использованием JUnit и проверим его, запустив тестовые примеры.
Запустите Android Studio.
Откройте HelloWorldApp, созданный в предыдущей главе.
Создайте файл Computation.java в app / src / main / java / com / tutorialspoint / espressosamples / helloworldapp / и напишите две функции - Sum и Multiply, как указано ниже,
package com.tutorialspoint.espressosamples.helloworldapp;
public class Computation {
public Computation() {}
public int Sum(int a, int b) {
return a + b;
}
public int Multiply(int a, int b) {
return a * b;
}
}
Создайте файл ComputationUnitTest.java в app / src / test / java / com / tutorialspoint / espressosamples / helloworldapp и напишите примеры модульных тестов для проверки функциональности Sum и Multiply, как указано ниже.
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
@Test
public void sum_isCorrect() {
Computation computation = new Computation();
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
Computation computation = new Computation();
assertEquals(4, computation.Multiply(2,2));
}
}
Здесь мы использовали два новых термина - @Test и assertEquals . В общем, JUnit использует аннотацию Java для идентификации тестовых примеров в классе и информации о том, как выполнять тестовые примеры. @Test - одна из таких аннотаций Java, в которой указывается, что конкретная функция является тестовым примером junit. assertEquals - это функция для утверждения, что первый аргумент (ожидаемое значение) и второй аргумент (вычисленное значение) равны и одинаковы. JUnit предоставляет ряд методов утверждения для различных сценариев тестирования.
Теперь запустите ComputationUnitTest в студии Android, щелкнув класс правой кнопкой мыши и вызвав опцию Run «ComputationUnitTest», как описано в предыдущей главе. Это запустит модульные тесты и сообщит об успехе.
Результат вычислительного модульного теста показан ниже -
Аннотации
Платформа JUnit широко использует аннотации . Некоторые из важных аннотаций следующие:
@Test
@Before
@After
@BeforeClass
@AfterClass
@Rule
@Test аннотация
@Test - очень важная аннотация в среде JUnit . @Test используется, чтобы отличить обычный метод от метода тестового примера. После того, как метод украшен аннотацией @Test , этот конкретный метод рассматривается как тестовый пример и будет запущен JUnit Runner . JUnit Runner - это специальный класс, который используется для поиска и запуска тестовых примеров JUnit, доступных внутри классов java. На данный момент мы используем возможность сборки Android Studio для запуска модульных тестов (которые, в свою очередь, запускают JUnit Runner ). Пример кода выглядит следующим образом:
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
@Test
public void multiply_isCorrect() {
Computation computation = new Computation();
assertEquals(4, computation.Multiply(2,2));
}
}
@До
Аннотация @Before используется для ссылки на метод, который необходимо вызвать перед запуском любого тестового метода, доступного в конкретном тестовом классе. Например, в нашем примере объект Computation может быть создан в отдельном методе и аннотирован с помощью @Before, чтобы он запускался перед тестовыми примерами sum_isCorrect и multiply_isCorrect . Полный код выглядит следующим образом:
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
Computation computation = null;
@Before
public void CreateComputationObject() {
this.computation = new Computation();
}
@Test
public void sum_isCorrect() {
assertEquals(4, this.computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, this.computation.Multiply(2,2));
}
}
@После
@After аналогичен @Before , но метод, помеченный @After, будет вызываться или выполняться после запуска каждого тестового примера. Пример кода выглядит следующим образом:
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
Computation computation = null;
@Before
public void CreateComputationObject() {
this.computation = new Computation();
}
@After
public void DestroyComputationObject() {
this.computation = null;
}
@Test
public void sum_isCorrect() {
assertEquals(4, this.computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, this.computation.Multiply(2,2));
}
}
@BeforeClass
@BeforeClass похож на @Before , но метод, аннотированный с помощью @BeforeClass, будет вызываться или выполняться только один раз перед запуском всех тестовых примеров в определенном классе. Полезно создать ресурсоемкий объект, например, объект подключения к базе данных. Это сократит время выполнения набора тестовых примеров. Для правильной работы этот метод должен быть статическим. В нашем примере мы можем создать объект вычисления один раз перед запуском всех тестовых случаев, как указано ниже,
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
private static Computation computation = null;
@BeforeClass
public static void CreateComputationObject() {
computation = new Computation();
}
@Test
public void sum_isCorrect() {
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, computation.Multiply(2,2));
}
}
@После урока
@AfterClass похож на @BeforeClass , но метод, аннотированный @AfterClass, будет вызываться или выполняться только один раз после запуска всех тестовых примеров в определенном классе. Для правильной работы этот метод также должен быть статическим. Пример кода выглядит следующим образом -
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
private static Computation computation = null;
@BeforeClass
public static void CreateComputationObject() {
computation = new Computation();
}
@AfterClass
public static void DestroyComputationObject() {
computation = null;
}
@Test
public void sum_isCorrect() {
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, computation.Multiply(2,2));
}
}
@ Правило
Аннотации @Rule - одна из изюминок JUnit . Он используется для добавления поведения к тестовым случаям. Мы можем аннотировать только поля типа TestRule . На самом деле он предоставляет набор функций, предоставляемый аннотациями @Before и @After, но эффективным и многоразовым способом. Например, нам может потребоваться временная папка для хранения некоторых данных во время тестового примера. Обычно нам нужно создать временную папку перед запуском тестового примера (используя аннотацию @Before или @BeforeClass) и уничтожить ее после запуска тестового примера (используя аннотацию @After или @AfterClass). Вместо этого мы можем использовать класс TemporaryFolder (типа TestRule ), предоставляемый фреймворком JUnit, для создания временной папки для всех наших тестовых примеров, и временная папка будет удаляться по мере запуска тестового примера. Нам нужно создать новую переменную типа TemporaryFolder и добавить аннотацию с помощью @Rule, как указано ниже,
package com.tutorialspoint.espressosamples.helloworldapp;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.IOException;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
public class ComputationUnitTest {
private static Computation computation = null;
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void file_isCreated() throws IOException {
folder.newFolder("MyTestFolder");
File testFile = folder.newFile("MyTestFile.txt");
assertTrue(testFile.exists());
}
@BeforeClass
public static void CreateComputationObject() {
computation = new Computation();
}
@AfterClass
public static void DestroyComputationObject() {
computation = null;
}
@Test
public void sum_isCorrect() {
assertEquals(4, computation.Sum(2,2));
}
@Test
public void multiply_isCorrect() {
assertEquals(4, computation.Multiply(2,2));
}
}
Порядок исполнения
В JUnit методы, помеченные разными аннотациями, будут выполняться в определенном порядке, как показано ниже.
@BeforeClass
@Rule
@Before
@Test
@After
@AfterClass
Утверждение
Утверждение - это способ проверки, соответствует ли ожидаемое значение тестового примера фактическому значению результата тестового примера. JUnit предоставляет утверждения для разных сценариев; несколько важных утверждений перечислены ниже -
fail() - Чтобы явно сделать тестовый пример неудачным.
assertTrue(boolean test_condition) - Проверяет, что test_condition истинно
assertFalse(boolean test_condition) - Проверяет, что test_condition ложно
assertEquals(expected, actual) - Проверяет, что оба значения равны
assertNull(object) - Проверяет, что объект нулевой
assertNotNull(object) - Проверяет, что объект не нулевой
assertSame(expected, actual) - Проверяет, ссылаются ли оба на один и тот же объект.
assertNotSame(expected, actual) - Проверяет, что оба ссылаются на разные объекты.