Android单元测试(三):使用JUnit进行单元测试

发表于:2018-5-25 11:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:一笑小先生    来源:简书

  初识Junit
  JUnit是一个测试框架,它使用注解来标识指定测试的方法。JUnit是一个在Github上托管的开源项目。
  如何在利用JUnit定义测试方法
  JUnit测试是一个仅用于测试类中使用的方法,这被称为测试类。要定义某个方法是测试方法,需要使用 @Test 注解对其进行注释。
  该方法用于执行测试中的代码。使用由JUnit或其他断言框架提供的断言方法来检查预期结果与实际结果。这些方法调用通常称为断言或断言语句。你需要提供一个有意义的断言结果。这使我们更容易的识别和解决问题。
  JUnit测试的例子
  第一篇文章我们其实已经通过JUnit简单的介绍了单元测试,现在我们再来详细介绍一下,待测试的类Calculator存在一个add(int, int)方法,以下代码显示了使用JUnit4测试这个类的方法。
  import org.junit.Assert;
  import org.junit.Test;
  public class CalculatorTest {
      @Test
      public void testAdd() {
          int sum = Calculator.add(1, 2);
          Assert.assertEquals(3, sum);
      }
  }
  定义测试方法
  Assert(断言)
  JUnit通过Assert类提供一系列静态的方法来测试某些条件是否通过。这些断言方法通常以assert开头,它们允许您指定错误信息,预期结果和实际结果。一个断言方法比较通过测试返回预期值实际值。如果比较失败将会抛出AssertionException。
  下表给出了这些方法的概述。[]括号中的参数是可选的,并且是String类型的
  JUnit test suites(测试套件)
  如果你有几个测试类都涉及某个类,且这个类发生了变化,你可以将它们组合成一个测试套件。运行测试套件以指定的顺序执行该套件中的所有测试类。测试套件还可以包含其他测试套件。
  以下示例代码演示了测试套件的用法。它包含两个测试类(ExampleUnitTest和CalculatorTest)。如果你想添加另一个测试类,你可以将它添加到@Suite.SuiteClasses语句中。
  @RunWith(Suite.class)
  @SuiteClasses({ExampleUnitTest.class, CalculatorTest.class})
  public class AllTests {
  }
  Parameterized test(参数化测试)
  JUnit允许你在测试类中使用参数。该类可以包含一个测试方法,并且此方法使用提供的不同参数执行。
  将测试类标记为带@RunWith(Parameterized.class)注释的参数化测试。
  这样的测试类必须包含一个用@Parameters注释标注的静态方法。该方法生成并返回一组数组。此集合中的每个项目都用作测试方法的参数。可以@Parameter在公共字段上使用注释来获取测试中注入的测试值。
  以下代码显示了参数化测试的示例:
  @RunWith(Parameterized.class)
  public class ParameterizedFiledTest {
      // fields used together with @Parameter must be public
      @Parameter(0)
      public int m1;
      @Parameter(1)
      public int m2;
      @Parameter(2)
      public int result;
      // creates the test data
      @Parameters
      public static Collection<Object[]> data() {
          Object[][] data = new Object[][]{{1, 2, 3}, {5, 3, 15}};
          return Arrays.asList(data);
      }
      @Test
      public void testAdd() {
          assertEquals(result, Calculator.add(m1, m2));
      }
  }
  或者提供类的构造函数,测试值通过构造函数传递给类
  @RunWith(Parameterized.class)
  public class ParameterizedConstructorTest {
      private int m1;
      private int m2;
      private int result;
      public ParameterizedConstructorTest(int m1, int m2, int result) {
          this.m1 = m1;
          this.m2 = m2;
          this.result = result;
          System.out.println("ParameterizedConstructorTest");
      }
      // creates the test data
      @Parameters
      public static Collection<Object[]> data() {
          Object[][] data = new Object[][]{{1, 2, 3}, {5, 3, 8}};
          return Arrays.asList(data);
      }
      @Test
      public void testAdd() {
          Assert.assertEquals(result, Calculator.add(m1, m2));
      }
  }
  JUnit Rules
  Rules允许在测试类中非常灵活地添加或重新定义每个测试方法的行为。测试人员可以重用或扩展下面提供的Rules之一,或者自己编写Rules。
  Verifier: 验证测试执行结果的正确性。
  ErrorCollector: 收集测试方法中出现的错误信息,测试不会中断,如果有错误发生测试结束后会标记失败。
  ExpectedException: 提供灵活的异常验证功能。
  Timeout: 用于测试超时的Rule。
  ExternalResource: 外部资源管理。
  TemporaryFolder: 在JUnit的测试执行前后,创建和删除新的临时目录。
  TestWatcher: 监视测试方法生命周期的各个阶段。
  TestName: 在测试方法执行过程中提供获取测试名字的能力。
  简单的说就是提供了测试用例执行过程中一些通用功能的共享的能力,使我们不必重复编写一些功能类似的代码。JUnit用于标注Rule的注解包括@Rule和@ClassRule,区别在于作用域不同@Rule的作用域是测试方法,@ClassRule则是测试Class。
  以下代码显示了实现的使用Verifier:
  public class RuleTest {
      private static String sequence;
      public static class UsesVerifier {
          @Rule
          public Verifier collector = new Verifier() {
              @Override
              protected void verify() {
                  sequence += "verify ";
              }
          };
          @Test
          public void example() {
              sequence += "test ";
          }
      }
      @Test
      public void verifierRunsAfterTest() {
          sequence = "";
          assertThat(testResult(UsesVerifier.class), isSuccessful());
          assertEquals("test verify ", sequence);
      }
  }
  有关现有Rules的更多示例,请参阅https://github.com/junit-team/junit4/wiki/Rules


上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号