Учебники

Espresso Testing Framework — Обзор JUnit

В этой главе давайте разберемся с основами 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 (ожидаемый, фактический) — проверяет, что оба ссылаются на разные объекты.