在讨论这个问题之前,我们可以先试图看一下阿里巴巴开发手册中的单元测试规范。从中能看到很多强制的规则,可见单元测试的规范对于一个项目的重要性。
为什么要做单元测试?
- 通过单元测试,开发者能做到心中有数,知道我们的代码在大体逻辑上是没有bug的。如果开发者尚且不知道自己写的程序有没有问题,那么就没必要交由测试人员测试,这样必然会浪费双方大量的时间。
- 通过单元测试,我们可以尽可能的保证项目质量。这里质量不仅当下的项目稳定性,对于项目后续的迭代都会有一个良好的支持。
- 单元测试其实对于新人来说是入手项目的最佳利器。可能我们维护了一大堆的wiki文档,讲的什么详细。但是正如Linus Torvalds所说那样,Talk is cheap , show me the code。只有我们能真正跑一遍代码,一步一步debug程序,我们才能保证我们对这段代码逻辑的理解。(当然这不是给你不写文档的借口)
- 想要在测试面前昂首挺胸的走过吗?没错,写的一手好的单元测试,装的一手好13。
好的单元测试有哪些特点?
- 非人工校验:好的单元测试必然是需要通过自动化方式执行的,千万不要通过打印日志的方式来人眼判断对错。
- 独立测试:我们要让测试类是独立,即尽量不要依赖第三方存储或者数据。我们需要对数据存储(redis,mysql等)进行mock。并且将预先需要的数据造好,放到测试resource中,待测试程序运行时先行导入。这样才能保证即使我们项目环境发生了变化,这些单元测试同样是能够执行的;同样,我们的测试类应该能够给任何人的时候都能运行,而不能出现“只能在我的机器上运行”这种情况。
- 单一测试:一个测试类只测试一个功能,一个测试方法只测试一个方法。要满足单一原则。这样的做法能够保证单测出问题时直接确定问题所在。
- 更新和迭代:对于有代码更新时,我们要做好单元测试的及时更新,千万不要放一堆不能跑的测试用例在那里。
- 适当的重构:被测的代码要有可测试性,适当的重构将会让我们的测试更加容易。
常用单元测试mock方法
mock 代码逻辑:通过mock内部方法,我们可以设定一些方法的特定返回值,这样才能满足我们想要测试的条件了。比如我们常用的mock框架就有powermock等等。这些自行网上查阅。
mock redis:https://github.com/50onRed/mock-jedis
mock mysql : 在Spring环境下,我们通过H2数据库mock DataSource。当然,我们需要将建表sql和数据sql写入到H2数据中。另外我们需要注意的是H2数据并不支持事物,如果需要对事物进行测试的话,就用不了这种方式了。
@Configuration
public class TestingDataSourceConfig {
@Bean
@Primary
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.generateUniqueName(true)
.setType(H2)
.setScriptEncoding("UTF-8")
.ignoreFailedDrops(true)
.addScript("schema.sql")
.addScripts("user_data.sql", "country_data.sql")
.build();
}
}
网友评论