Java-测试框架-齐聚一堂
测试框架-齐聚一堂
JUnit
Unit
单元测试
- @Test
测试方法
a)(expected=XXException.class)如果程序的异常和XXException.class一样,则测试通过
b)(timeout=100)如果程序的执行能在100毫秒之内完成,则测试通过
- @Ignore
被忽略的测试方法:加上之后,暂时不运行此段代码
- @Before
每一个测试方法之前运行
- @After
每一个测试方法之后运行
- @BeforeClass
方法必须必须要是静态方法(static 声明),所有测试开始之前运行,注意区分before,是所有测试方法
- @AfterClass
方法必须要是静态方法(static 声明),所有测试结束之后运行,注意区分- @After
Spring With JUnit
依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>provided</scope>
</dependency>
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration(locations={"classpath:applicationContext.xml"}) //加载配置文件
//------------如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,在测试类的方法上///控制事务,参见下一个实例
//这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
//@Transactional
//这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时//指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
//------------
public class BaseJunit4Test{
}
Spring Boot
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class SomeServiceTest {
}
Webmvc With JUnit
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
@WebAppConfiguration
public class SomeControllerTest {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.webAppContextSetup(context).build();//建议使用这种
}
@Test
public void test() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/some")
.contentType(MediaType.APPLICATION_JSON_UTF8)
.param("name", "Percy")
.param("lon", "456.456")
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("Hello World: Percy")));
}
}
Spock
Spock With Spring
@ContextConfiguration(classes = BootTestApplication)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
class SomeServiceSpec extends Specification{
private Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
SomeService someService
def "test autowired"() {
when:
String result = someService.handle("123")
log.info("==============={}", result)
then:
someService != null
}
}
Features
基于Groovy的Spock框架
摘要
Spock是一个用于Java或者Groovy程序的测试框架。利用Groovy的语言特性,Spock可以更加快速的编写单元测试,也可以使单元测试更加清晰、简洁。更详细的介绍以及用法可以在官方文档上看到,下面进行一些简单的介绍和实例演示
内置预定义方法
- setup()
相当于@Before
- cleanup()
相当于@After
- setupSpec()
相当于@BeforeClass
- cleanupSpec()
相当于@AfterClass
- when
在这个块中调用要测试的方法
- then
when与then需要搭配使用,在when中执行待测试的函数,在then中判断是否符合预期
- expect:
一般跟在setup块后使用,包含一些assert语句,检查在setup块中准备好的测试环境
- where
做测试时最复杂的事情之一就是准备测试数据,尤其是要测试边界条件、测试异常分支等,这些都需要在测试之前规划好数据。
- clearup
主要做一些清理工作,例如关闭资源连接等。
- given
given相当于setup, 在方法内使用
def setup() {} // run before every feature method
def cleanup() {} // run after every feature method
def setupSpec() {} // run before the first feature method
def cleanupSpec() {} // run after the last feature method
注解讲解
- @Title(“测试的标题”)
测试的标题
-
@Title(“测试的标题”)
-
@Stepwise
当测试方法间存在依赖关系时,标明测试方法将严格按照其在源代码中声明的顺序执行
-
@Stepwise
-
@Subject
标明被测试的类是Adder
-
@Subject(Adder) //标明被测试的类是Adder
-
@Narrative
关于测试的大段文本描述
-
@Narrative(""“关于测试的大段文本描述”"")
-
@Unroll
where块中的每行参数都转换为一个独立的测试用例
- @Unroll(“test #para0, #para1”)
阶段
概念上,测试方法包含4个阶段
基本设置
执行语句
测试结果
清理设置
示例
依赖级联测试
def "依赖级联测试"() {
setup:
UserRepo userRepo = Mock(UserRepo);
User user = new User();
user.with {
id = 123
name = 'SomeOne'
}
FeatureService featureService = new FeatureService()
featureService.userRepo = userRepo
1 * userRepo.get(123) >> user
when:
User result = featureService.findOne(123)
then:
result == user
}
参数化测试
/**
* 使用when-then进行参数化测试
*
*
*
*/
def "参数化测试"() {
when:
FeatureService featureService = new FeatureService()
then:
featureService.add(a, b) == sum
where:
a | b | sum
1 | 2 | 3
1 | 3 | 4
}
模拟异常
def "模拟异常"() {
given:
FeatureService featureService = Mock(FeatureService)
and:
featureService.findOne(1) >> {
throw new RuntimeException("哈哈,中计了")
}
when: "踩坑"
featureService.findOne(1)
then: "validator"
RuntimeException runtimeException = thrown(RuntimeException)
runtimeException.message == "哈哈,中计了"
}
Mockito
主要是Mock模拟对象,进行相关测试,如果测试私有方法和静态方法一般结合powermock与mockito使用。
Powermock
与mockito结合使用
Selenium
主要是模拟浏览器行为,可以进行录制
源码参考地址:
https://github.com/Percy0601/boot-features/tree/master/boot-features-test