В этой главе давайте разберемся с основами JUnit , популярной среды модульного тестирования, разработанной сообществом Java, на которой построена среда тестирования эспрессо.
JUnit является стандартом де-факто для модульного тестирования Java-приложений. Несмотря на то, что он популярен для модульного тестирования, он также имеет полную поддержку и возможности для тестирования приборов. Библиотека тестирования Espresso расширяет необходимые классы JUnit для поддержки инструментального тестирования на базе Android.
Написать простой модульный тест
Давайте создадим Java-класс Computation (Computation.java) и напишем простую математическую операцию суммирования и умножения . Затем мы напишем контрольные примеры, используя JUnit, и проверим его, выполнив контрольные примеры.
-
Запустите Android Studio.
-
Откройте HelloWorldApp, созданный в предыдущей главе.
-
Создайте файл Computation.java в приложении / src / main / java / com / tutorialspoint / espressosamples / helloworldapp / и напишите две функции — Sum и Multiply, как указано ниже,
Запустите Android Studio.
Откройте HelloWorldApp, созданный в предыдущей главе.
Создайте файл Computation.java в приложении / 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, как указано ниже.
Создайте файл 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’, как описано в предыдущей главе. Это запустит случаи модульного тестирования и сообщит об успехе.
Теперь запустите ComputationUnitTest в Android-студии, щелкнув правой кнопкой мыши по классу и вызвав опцию Run ‘ComputationUnitTest’, как описано в предыдущей главе. Это запустит случаи модульного тестирования и сообщит об успехе.
Результат вычислительного модульного теста показан ниже:
Аннотации
Инфраструктура JUnit широко использует аннотации . Вот некоторые важные аннотации:
-
@Тестовое задание
-
@До
-
@После
-
@BeforeClass
-
@После школы
-
@Rule
@Тестовое задание
@До
@После
@BeforeClass
@После школы
@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)); } }
@До
@ Перед аннотацией используется для ссылки на метод, который необходимо вызвать перед запуском любого метода тестирования, доступного в определенном классе теста. Например, в нашем примере объект 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
@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
-
@До
-
@Тестовое задание
-
@После
-
@После школы
@BeforeClass
@Rule
@До
@Тестовое задание
@После
@После школы
Утверждение
Утверждение — это способ проверки, соответствует ли ожидаемое значение контрольного примера фактическому значению результата контрольного примера. JUnit обеспечивает утверждение для другого сценария; несколько важных утверждений перечислены ниже —
fail () — явно сделать тестовый случай неудачным.
assertTrue (boolean test_condition) — проверяет, что test_condition является истинным
assertFalse (логическое test_condition) — проверяет, что test_condition имеет значение false
assertEquals (ожидаемый, фактический) — проверяет, что оба значения равны
assertNull (object) — проверяет, что объект является нулевым
assertNotNull (object) — проверяет, что объект не является нулевым
assertSame (ожидаемый, фактический) — проверяет, что оба ссылаются на один и тот же объект.
assertNotSame (ожидаемый, фактический) — проверяет, что оба ссылаются на разные объекты.