基本背景
团队开发任务中涉及一个移动应用的 Java 后端,以增删查改 (CRUD) 为主,附加一些其他的服务逻辑。系统的持久层是用一些以 DAO 做名字结尾的类构成的。每一个 DAO 里面实现了增删查改的具体实现,一般模式是获得一个 Hibernate Session,运行 SQL Query,再把结果组织一下返回给客户端。
由于 DAO 类的这种开发模式,运行 JUnit 单元测试的时候需要环境中有一个配置好的 MySQL 实例,这极大限制了代码包持续构建的能力。
代码的持续构建对于开发效率来说是非常重要的。比较理想的情况是开发者每提交一次 commit, 代码托管平台上能够自动构建一下,并运行单元测试来保证基本逻辑不出问题。这样代码审阅者可以在知道测试通过的前提下来阅读代码,可以节省自己下载代码、测试的手工步骤。
还有是部署前的构建也希望能有一些测试来验证。为了节约网络传输成本,我们在生产环境构建新版本的代码包,而由于这些测试对数据库的依赖,构建的时候如果运行单元测试,有可能对生产服务器上的数据造成污染,所以我们选择了不进行部署前的单元测试。
问题描述
我们希望做到
- 代码托管平台可以自动构建每一个上传的 commit
- 部署之前能够稳定、安全地运行一些测试
第一个目标有赖于具体托管平台的工具,这篇博文不具体讨论这些工具的使用情况。更容易解决的是第二个问题,如果保证了运行单元测试的时候和数据库实例解耦,就不用担心污染生产数据的问题了。当然还有一个解决方法是在其他环境构建好代码包,然后通过网络传输到生产服务器,但由于网络带宽有限,从开发机上传代码包需要几十分钟,所以在生产服务器上构建是尝试过的效率比较高的方法了。
于是为了实现