IDE之外的java连续测试
我有很多Java单元测试,我想将一个连续测试框架集成到我的代码库中。理想情况下,我希望编写一个Maven/Ant目标或bash脚本,只要它所监视的文件发生变化,它就会开始运行测试。到目前为止,我已经研究了几个选项(Infinitest、JUnit Max),但它们似乎都希望作为IDE插件运行 我之所以使用仅限CLI的工具,是因为我的同事使用了大量的文本编辑器和IDE,但我想确保任何人都可以不断运行测试 <> > >编辑:我没有考虑詹金斯或其他更典型的CI解决方案有以下几个原因:IDE之外的java连续测试,java,junit,continuous-integration,continuous-testing,infinitest,Java,Junit,Continuous Integration,Continuous Testing,Infinitest,我有很多Java单元测试,我想将一个连续测试框架集成到我的代码库中。理想情况下,我希望编写一个Maven/Ant目标或bash脚本,只要它所监视的文件发生变化,它就会开始运行测试。到目前为止,我已经研究了几个选项(Infinitest、JUnit Max),但它们似乎都希望作为IDE插件运行 我之所以使用仅限CLI的工具,是因为我的同事使用了大量的文本编辑器和IDE,但我想确保任何人都可以不断运行测试 > >编辑:我没有考虑詹金斯或其他更典型的CI解决方案有以下几个原因: 我们已经有了一个C
- 我们已经有了一个CI构建工具,可以在每次推送之后运行单元和集成测试
- 它们隐藏了测试的运行时(因为它们是异步运行的),允许测试变得越来越慢,而没有人真正注意到
- 它们通常仅在存储库位于某个中心位置时运行测试。我希望在编辑时运行单元测试,而不是在我已经将代码推送到某个地方之后。我越早运行测试,就越早修复编辑时犯的任何错误。我们的JavaScript团队喜欢类似的工具,引用了3倍于单元测试开发迭代的加速
让Jenkins每15分钟轮询一次您的版本控制系统,它将在您的项目提交时构建您的项目。您永远都不会忘记您的源代码是否有效。我建议您使用CI工具,例如,您不仅可以在本地安装,而且,还可以通过一个测试来获得Jenkins云实例,在这个测试中,您可以轻松地测试此解决方案是否能够满足您的目标,而无需在设置过程中花费太多时间 此PaaS提供了一些可用于您自己项目的模板,无论是在本地还是在云上。它将为您生成一个Jenkins作业,该作业已完全设置好并正常工作 您可以查看的一些文章有:
- 在那里你可以看到你可以得到的仪表板。您将看到每个构建都通过的maven测试,还可以得到一个显示通过、跳过和失败的maven测试的图表
- 尽管本文专门讨论了iOS,但对于标准JavaMaven项目,您也可以实现相同的目标:测试覆盖率、测试结果、代码复制、代码度量(LOC)
您打算如何查看测试结果?您不需要仪表板来发现测试失败吗?建议的CI解决方案似乎涵盖了您的需求,因为它可以监视(本地)SCM并显示当前的测试结果。您必须在自己的机器上运行一个私有实例(Jenkins很适合这样做,它非常轻量级,只有一个WAR文件)。当与提供变更挂钩的SCM结合时,您应该会得到您想要的东西。我会让一个进程在后台运行,它会在出现任何测试失败时打印出来。
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:\java\dev\eclipse_workspaces\project\help\content/
]
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()