集成测试时使用独立的数据库

1.需求:

引用
开发环境的db经常会出现错误数据的问题,原因是多方面的,例如程序自测时的bug,不规范的开发人员经常会手动更改db的数据等,所以单元测试和集成测试需要独立的db来避免由于错误数据造成的test failed的情况,或者是造成的偶然test success的情况

2.思路

引用
单元测试需要在src/test/resources下建立db配置文件,测试时就不会再读取src/main/resources下的同名db配置文件

集成测试时会通过maven-jetty-plugin启动jetty,这时jetty运行的war需要到src/test/resources下读取db配置文件

3.难点

引用
maven install也会运行verify,这时集成测试与install都使用dev_profile,也就是使用同一个db配置文件,如果因为集成测试而使用verify_profile,会造成install的war使用的是集成测试的db,无法deploy并交付测试

另外install无法只skip集成测试,它只允许skipTest,导致单元测试和集成测试都skip

4.解决方案

<!-- maven-jetty-plugin增加配置useTestClasspath -->
<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
				<version>6.1.26</version>
				<configuration>
					<scanIntervalSeconds>10</scanIntervalSeconds>
					<stopKey>stop-jetty-for-it</stopKey>
					<stopPort>9999</stopPort>
					<connectors>
						<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
							<port>8888</port>
							<maxIdleTime>60000</maxIdleTime>
						</connector>
					</connectors>
				</configuration>
				<executions>
					<execution>
						<id>start-jetty</id>
						<phase>pre-integration-test</phase>
						<goals>
							<goal>run</goal>
						</goals>
						<configuration>
							<scanIntervalSeconds>0</scanIntervalSeconds>
							<daemon>true</daemon>
							<reload>manual</reload>
							<!-- 使得集成测试使用src/test/resources的配置 -->
							<useTestClasspath>true</useTestClasspath>
						</configuration>
					</execution>
					<execution>
						<id>stop-jetty</id>
						<phase>post-integration-test</phase>
						<goals>
							<goal>stop</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

5.关于maven-jetty-plugin

引用
jetty6对应的是maven-jetty-plugin,jetty7+对应的则是jetty-maven-plugin,参数useTestClasspath也变为useTestScope

相关推荐