DevTestOpsGuide

开发 测试 上线 的经验与笔记

View project on GitHub

java_test_writing

较长的测试使用 GWT 格式定义

GIVEN, WHEN, THEN

设参、调用、断言

注意断言参数顺序,期望在中间

JUnit  assertEquals(可选描述, 期望, 实际)
TestNG assertEquals(实际, 期望, 可选描述)

使用 TestNG

  • JUnit 的 before 每个类前都会运行一次
  • TestNG 支持依赖

所有测试类都应最终继承本项目的某个类

本项目的这个类再继承公共模块,方便改造

  • JUnit 要实现在所有测试前执行必须用继承
  • TestNG 虽然可以不用继承,使用@BeforeSuite在所有类前只执行一次,但是单个运行时就不会生效
TestNG JUnit 5 JUnit 4 JUnit method spock
@BeforeSuite        
@BeforeTest        
@BeforeGroups        
@BeforeClass @BeforeAll @BeforeClass is static setupSpec()
@BeforeMethod @BeforeEach @Before no static setup()
@Test(priority @Order(1)      
@Ignore @Disabled @Ignore    
@Test(groups @Tag @Categories    

注意 JUnit 方法是否静态的要求

注意没设置时 TestNG 会忽略带返回值的测试方法

依赖环境的测试使用条件标签便于过滤

TestNG 过滤

TestNG 组@Test(groups = { "db", "slow" }): https://testng.org/doc/documentation-main.html#test-groups

TestNG 命令执行过滤组-groups, -excludegroups db,slow: https://testng.org/doc/documentation-main.html#running-testng

JUnit 5 过滤

JUnit 5 条件执行@EnabledIf("cn.demo.test.DbOnline"): https://JUnit.org/JUnit5/docs/current/user-guide/#writing-tests-conditional-execution

JUnit 5 标签@Tag("db"), @Tag("slow"): https://JUnit.org/JUnit5/docs/current/user-guide/#writing-tests-tagging-and-filtering

JUnit 5 命令执行过滤标签-t, -T=db -T=slow: https://JUnit.org/JUnit5/docs/current/user-guide/#running-tests-console-launcher-options

JUnit 5 Maven执行过滤标签: https://JUnit.org/JUnit5/docs/current/user-guide/#running-tests-build-maven-filter-tags

      <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.2</version>
          <configuration>
              <groups>acceptance | !feature-a</groups>
              <excludedGroups>integration, regression</excludedGroups>
          </configuration>
      </plugin>

必要时做多线程测试

TestNG 多线程

@Test(threadPoolSize = 3, invocationCount = 10,  timeOut = 10000)