Espresso 测试框架 - JUnit 概述


在本章中,让我们了解JUnit的基础知识,JUnit 是 Java 社区开发的流行单元测试框架,espresso 测试框架就是在此基础上构建的。

JUnit是 Java 应用程序单元测试的事实上的标准。尽管它在单元测试中很受欢迎,但它也为仪器测试提供了完整的支持和规定。Espresso 测试库扩展了必要的 JUnit 类以支持基于 Android 的仪器测试。

编写一个简单的单元测试

让我们创建一个 Java 类Computation (Computation.java) 并编写简单的数学运算、求和乘法然后,我们将使用JUnit编写测试用例并通过运行测试用例来检查它。

  • 启动 Android Studio。

  • 打开上一章中创建的HelloWorldApp 。

  • app/src/main/java/com/tutorialspoint/espressosamples/helloworldapp/中创建一个文件Computation.java并编写两个函数 – SumMultiply,如下所示,

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;
   }
}
  • 在 app/src/test/java/com/tutorialspoint/espressosamples/helloworldapp 中创建文件 ComputationUnitTest.java 并编写单元测试用例来测试 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));
   }
}

在这里,我们使用了两个新术语—— @TestassertEquals。一般来说,JUnit 使用 Java 注释来标识类中的测试用例以及有关如何执行测试用例的信息。@Test就是这样一种 Java 注释,它指定特定函数是一个 junit 测试用例。assertEquals是一个断言第一个参数(期望值)和第二个参数(计算值)相等且相同的函数。JUnit针对不同的测试场景提供了多种断言方法。

  • 现在,通过右键单击该类并调用“运行‘ComputationUnitTest’”选项,在 Android studio 中运行 ComputationUnitTest,上一章所述。这将运行单元测试用例并报告成功。

计算单元测试结果如下所示 -

计算单元测试

注释

JUnit 框架广泛使用注释。一些重要的注释如下 -

  • @测试

  • @前

  • @后

  • @课前

  • @下课以后

  • @规则

@Test注解

@Test是JUnit框架中非常重要的注解。@Test用于区分普通方法和测试用例方法。一旦一个方法被@Test注解修饰,那么该特定方法就被视为一个测试用例,并将由JUnit Runner运行。JUnit Runner是一个特殊的类,用于查找并运行java 类中可用的JUnit 测试用例。目前,我们使用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_isCorrectmultiply_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与@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的亮点之一。它用于向测试用例添加Behave。我们只能注释TestRule类型的字段。它实际上提供了@Before@After注释提供的功能集,但以高效且可重用的方式提供。例如,我们可能需要一个临时文件夹来存储测试用例期间的一些数据。通常,我们需要在运行测试用例之前创建一个临时文件夹(使用@Before或@BeforeClass注释)并在测试用例运行后销毁它(使用@After或@AfterClass注释)。相反,我们可以使用JUnit框架提供的TemporaryFolder(类型为TestRule )类为所有测试用例创建一个临时文件夹,并且该临时文件夹将在测试用例运行时被删除。我们需要创建一个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中,带有不同注解的方法将按照特定顺序执行,如下所示:

  • @课前

  • @规则

  • @前

  • @测试

  • @后

  • @下课以后

断言

断言是检查测试用例的期望值与测试用例结果的实际值是否匹配的一种方法。JUnit针对不同场景提供断言;下面列出了一些重要的断言 -

  • fail() - 显式地使测试用例失败。

  • assertTrue(boolean test_condition) - 检查 test_condition 是否为 true

  • assertFalse(boolean test_condition) - 检查 test_condition 是否为 false

  • 断言Equals(预期,实际) - 检查两个值是否相等

  • assertNull(object) - 检查对象是否为空

  • assertNotNull(object) - 检查对象是否不为空

  • assertSame(expected,actual) - 检查两者是否引用相同的对象。

  • assertNotSame(expected,actual) - 检查两者是否引用不同的对象。