我有一堆Java单元测试,我想将一个连续测试框架集成到我的代码库中。理想情况下,我希望编写一个Maven/Ant目标或bash脚本,以便在它监视的文件发生变化时开始运行测试。到目前为止,我已经看过几个选项(Infinitest, JUnit Max),但它们似乎都想作为IDE插件运行。
我使用仅限cli的工具的动机是我的同事使用广泛的文本编辑器和ide,但我想确保任何人都可以经常运行测试。
EDIT:我没有考虑Jenkins或其他更典型的CI解决方案,原因如下:
- 我们已经有了一个CI构建工具,用于在每次推送后运行单元和集成测试。
- 它们隐藏了测试的运行时(因为它们异步运行),允许测试变得越来越慢,而人们却没有真正注意到。
- 它们通常只在您的存储库位于某个中心位置时运行测试。我希望单元测试在我编辑时运行,而不是在我已经将代码推到某个地方之后。越早运行测试,我就能越早修复编辑时所犯的任何错误。我们的JavaScript团队也喜欢一个类似的工具,在单元测试开发中迭代的速度提高了3倍。
我正在使用连续轮询的目录更改解决方案。(通用代码:http://www.qualityontime.eu/articles/directory-watcher/groovy-poll-watcher/(匈牙利语,但源代码是英语))
编译基于nanoc的站点的定制解决方案。审查和定制您的需要。(Groovy)
def job = {
String command = /java -jar jruby-nanoc2.jar -S nanoc compile/
println "Executing "+command
def proc = command.execute()
proc.waitForProcessOutput(System.out, System.err)
}
params = [
closure: job,
sleepInterval: 1000,
dirPath: /R:javadeveclipse_workspacesprojecthelpcontent/
]
import groovy.transform.Canonical;
@Canonical
class AutoRunner{
def closure
def sleepInterval = 3000
// running for 8 hours then stop automatically if checking every 3 seconds
def nrOfRepeat = 9600
def dirPath = "."
long lastModified = 0
def autorun(){
println "Press CTRL+C to stop..."
println this
def to_run = {
while(nrOfRepeat--){
sleep(sleepInterval)
if(anyChange()){
closure()
}
}
} as Runnable
Thread runner = new Thread(to_run)
runner.start()
}
def boolean anyChange(){
def max = lastModified
new File(dirPath).eachFileRecurse {
if(it.name.endsWith('txt') && it.lastModified() > max){
max = it.lastModified()
}
}
if(max > lastModified){
lastModified = max
return true
}
return false;
}
}
new AutoRunner(params).autorun()
为什么不使用像Jenkins这样的CI工具在每个代码更改上运行测试,作为整体CI构建的一部分呢?当文件更改时,让Jenkins轮询您的源代码控制系统并运行构建或单独的测试作业很容易。
通常的方法是使用持续集成服务器,如Jenkins。
让Jenkins每15分钟轮询你的版本控制系统,它会在注意到提交时构建你的项目。您将永远不会知道您的源代码是否有效。
我建议使用像Jenkins这样的CI工具,您不仅可以在内部安装,还可以通过PaaS获得Jenkins云实例,在那里您可以轻松测试该解决方案是否可以满足您的目标,而无需在设置过程中花费太多时间。
这个PaaS提供了一些ClickStarts,您可以将其用作您自己项目的模板,在本地或云上。它将生成一个完全设置和工作的Jenkins作业。
你可以看的文章有:
- 无痛Maven构建与Jenkins在那里你可以看到你可以得到的仪表板。你可以看到每次构建通过的maven测试,你也可以得到一个图表,显示通过、跳过和失败的maven测试。 iOS开发者:如何在Jenkins作业中设置质量指标?尽管本文主要讨论的是iOS,但你也可以从标准java maven项目中获得相同的目标:测试覆盖率、测试结果、代码复制、代码度量(LOC)等等。
是的,拥有一个构建服务器(如Bamboo, Cruise Control或TeamCity)和一个构建工具,如Maven(以及用于TestNg/Junit的surefire插件和用于集成测试的failsafe插件,可能使用类似Selenium 2的东西)是相当受欢迎的,因为它的设置相对简单(几乎开箱即用)。:)