Spring、Spring Boot和TestNG测试指南 ( 5 )

发表于:2017-12-14 11:22

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

 作者:chanjarster    来源:ImportNew

分享:
  这里和例子1的区别在于,我们提供了一个PlatformTransactionManager Bean,这是因为在下面的测试代码里的AbstractTransactionalTestNGSpringContextTests需要它。
Spring_2_IT.java:
@ContextConfiguration(classes = Spring_2_IT_Configuration.class)
public class Spring_2_IT extends AbstractTransactionalTestNGSpringContextTests {
@Autowired
private FooRepository fooRepository;
@Test
public void testSave() {
Foo foo = new Foo();
foo.setName("Bob");
fooRepository.save(foo);
assertEquals(countRowsInTable("FOO"), 1);
countRowsInTableWhere("FOO", "name = 'Bob'");
}
@Test(dependsOnMethods = "testSave")
public void testDelete() {
assertEquals(countRowsInTable("FOO"), 0);
Foo foo = new Foo();
foo.setName("Bob");
fooRepository.save(foo);
fooRepository.delete(foo.getName());
assertEquals(countRowsInTable("FOO"), 0);
}
}
  在这里我们使用countRowsInTable(“FOO”)来验证数据库结果,这个方法是AbstractTransactionalTestNGSpringContextTests对JdbcTestUtils的代理。
  而且要注意的是,每个测试方法在执行完毕后,会自动rollback,所以在testDelete的第一行里,我们assertEquals(countRowsInTable(“FOO”), 0),这一点和例子1里是不同的。
  更多关于Spring Testing Framework与Transaction相关的信息,可以见Spring官方文档 Transaction management。
  例子3:使用Spring Boot
Boot_1_IT.java:
@SpringBootTest
@SpringBootApplication(scanBasePackageClasses = FooRepository.class)
public class Boot_1_IT extends AbstractTransactionalTestNGSpringContextTests {
@Autowired
private FooRepository fooRepository;
@Test
public void testSave() {
Foo foo = new Foo();
foo.setName("Bob");
fooRepository.save(foo);
assertEquals(countRowsInTable("FOO"), 1);
countRowsInTableWhere("FOO", "name = 'Bob'");
}
@Test(dependsOnMethods = "testSave")
public void testDelete() {
assertEquals(countRowsInTable("FOO"), 0);
Foo foo = new Foo();
foo.setName("Bob");
fooRepository.save(foo);
fooRepository.delete(foo.getName());
assertEquals(countRowsInTable("FOO"), 0);
}
@AfterTest
public void cleanDb() {
flyway.clean();
}
}
  因为使用了Spring Boot来做集成测试,得益于其AutoConfiguration机制,不需要自己构建DataSource 、JdbcTemplate和PlatformTransactionManager的Bean。
  并且因为我们已经将flyway-core添加到了maven依赖中,Spring Boot会利用flyway来帮助我们初始化数据库,我们需要做的仅仅是将sql文件放到classpath的db/migration目录下:
V1.0.0__foo-ddl.sql:
CREATE TABLE FOO (
name VARCHAR2(100)
);
  而且在测试最后,我们利用flyway清空了数据库:
@AfterTest
public void cleanDb() {
flyway.clean();
}
  使用flyway有很多好处:
  1、每个sql文件名都规定了版本号
  2、flyway按照版本号顺序执行
  3、在开发期间,只需要将sql文件放到db/migration目录下就可以了,不需要写类似EmbeddedDatabaseBuilder.addScript()这样的代码
  4、基于以上三点,就能够将数据库初始化SQL语句也纳入到集成测试中来,保证代码配套的SQL语句的正确性
  5、可以帮助你清空数据库,这在你使用非内存数据库的时候非常有用,因为不管测试前还是测试后,你都需要一个干净的数据库
相关文章

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

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号