背景:
build.xml现在我一般用build.groovy代替了,自己用AntBuilder做***,
1. 想在build.groovy里运行一个unit-test-suit(groovy文件),于是代码如下:
def ant = new AntBuilder()
ant.path id: 'classpath', {
pathelement path: bin_dir
pathelement path: gy_dir
pathelement path: config_dir_app
fileset dir: lib_dir, {
include name: '*.jar'
}
}
ant.taskdef name: "groovy",
classname: "org.codehaus.groovy.ant.Groovy"
ant.groovy src: "${src_dir_test}/AppTestRun.groovy",
classpathref: "classpath", {
arg value: src_dir_test
arg value: app_name + ' Unit Test Result Report'
}
2. AppTestRun.groovy如下:
import junit.framework.TestResult
import junit.framework.TestSuite
import junit.textui.TestRunner
import util.WebxHtmlTestListener
// src/test directory path
String dirRoot = args[0]
String testTitle = args[1]
// current classloader (GroovyClassLoader instance)
def cl = this.class.classLoader
TestSuite suite = new TestSuite()
new File(dirRoot).eachFileRecurse{
if(it.name.startsWith('Test') && it.name.endsWith('.groovy')){
suite.addTestSuite(cl.parseClass(new File(it.absolutePath)))
}
}
// customized output format
def testresult = new TestResult()
def listener = new WebxHtmlTestListener(dirRoot)
testresult.addListener(listener)
suite.run(testresult)
listener.outTestResult()
listener.outFrame(testTitle, testresult)
3. WebxHtmlTestListener就是用来生成html test report的了,代码如下
package util
import junit.framework.*
/**
* TIPS: test methods with same name exception
*/
class WebxHtmlTestListener implements TestListener{
// base dir path
String dirRoot
// save all test result ( failure or error )
Map results = [:]
// test method names
List tests = []
int stackNumLimit = 10
public WebxHtmlTestListener(String dirRoot){
this.dirRoot = dirRoot
Tpl.init("${dirRoot}/tpl/", 'utf-8')
}
void out(Map params, String tpl, String outputPath){
// blueprint css file path refer to target file
params.dir = '../tpl'
// target file
File f = new File("${dirRoot}/output/${outputPath}.html")
Tpl.out(params, tpl, f.newPrintWriter())
}
// generate index.html / navigation.html / summury.html
void outFrame(String title, TestResult result){
List testLl = tests.collect{[name: it]}
testLl.each{test ->
if(results.error)
test.hasError = results.error.grep{it.name == test.name}.size() > 0
if(results.fail)
test.hasFail = results.fail.grep{it.name == test.name}.size() > 0
}
def params = [:]
params.title = title
params.tests = testLl
params.result = [
errorCount: result.errorCount(),
failureCount: result.failureCount(),
wasSuccessful: result.wasSuccessful(),
]
out(params, 'testResultNav.html', 'testResultNav')
out(params, 'testResultSum.html', 'testResultSum')
out(params, 'testResultFrame.html', 'index')
}
void outTestResult(){
tests.eachWithIndex{testName, i ->
def params = [:]
params.errors = results.error?.grep{it.name == testName}
params.fails = results.fail?.grep{it.name == testName}
if(i > 0){
params.pre = tests[i - 1]
}
if(i < tests.size() - 1){
params.nn = tests[i + 1]
}
params.title = testName
out(params, 'testResult.html', testName)
}
}
String getTestName(Test test){
String name = test.toString()
return name.substring(0, name.indexOf('('))
}
public void addError(Test test, Throwable t){
if(!results.error)
results.error = []
def stacks = t.stackTrace
List ll = stacks.collect{
[
fileName: it.fileName,
className: it.className,
methodName: it.methodName,
lineNumber: it.lineNumber,
isInMsg: it.fileName && it.fileName.contains('groovy')
]
}
results.error << [name: getTestName(test),
type: 'error',
msg: t.message,
stacks: ll[0..stackNumLimit]]
}
public void addFailure(Test test, AssertionFailedError t){
if(!results.fail)
results.fail = []
def stacks = t.stackTrace
List ll = stacks.collect{
[
fileName: it.fileName,
className: it.className,
methodName: it.methodName,
lineNumber: it.lineNumber,
isInMsg: it.fileName && it.fileName.contains('groovy')
]
}
results.fail << [name: getTestName(test),
type: 'fail',
msg: t.message,
stacks: ll[0..stackNumLimit]]
}
public void endTest(Test test){
}
public void startTest(Test test){
tests << getTestName(test)
}
}
至于Tpl,我是用smart4j做html输出的,用freemarker,groovy总报错——估计是个bug,悲剧
4.
package util
import org.lilystudio.smarty4j.*
class Tpl {
def static engine = new Engine()
static void init(String path, String charset){
engine.setTemplatePath(path)
}
static void out(Map map, String tpl, Writer writer) {
def template = engine.getTemplate(tpl)
def ctx = new Context()
ctx.putAll(map)
template.merge(ctx, writer)
writer.flush()
writer.close()
}
}
附件是生成的报告截图
- 大小: 32.7 KB
分享到:
相关推荐
本案例聚焦于使用Groovy脚本语言来实现一个特定的功能:从明细表中提取字段值,并将其更新到主表对应的字段中。这样的操作对于数据同步、报表生成以及业务流程自动化等场景非常常见。 Groovy是一种动态、灵活的Java...
在“groovy代码-groovy test”这个主题中,我们主要会探讨Groovy语言的基本概念、语法特点以及如何进行测试。 1. **Groovy基本概念** - **动态类型**:Groovy是动态类型的,这意味着变量的类型是在运行时确定的,...
3. 加载并执行Groovy脚本:通过GroovyClassLoader的`parseClass()`方法解析Groovy源码,然后使用`newInstance()`方法创建脚本实例,最后通过`invokeMethod()`方法执行脚本中的方法。 在Java与MongoDB的交互中,我们...
此外,Groovy还有闭包(Closure)的概念,这是Groovy强大的功能之一,它可以用来处理函数式编程任务,如数据过滤和映射。 其次,Groovy的动态特性是另一个关键知识点。Groovy可以在运行时改变类的结构,这意味着你...
JavaGroovy用Groovy更迅速地对Java代码进行单元测试软件测试不久以前,developerWorks的作者AndrewGlover撰写了一篇介绍的文章,该文章是alt.lang.jre系列的一部分,而Groovy是一个新提议的用于平台的标准语言。...
安装Groovy后,开发者可以使用Groovy Shell(groovysh)进行交互式编程,或者编写Groovy脚本执行任务。Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发...
Groovy是完全兼容Java的,这意味着Java开发人员可以轻松地使用Groovy编写程序,并利用Groovy提供的强大功能简化开发流程。 Groovy能够为脚本编写人员提供一种更直接、更易于表达的编程方式。脚本编写人员可以使用...
Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...
在“groovy脚本实现对数据库的增删改查”这个主题中,我们将深入探讨如何使用Groovy来执行常见的数据库操作。首先,我们需要连接到数据库。在Groovy中,我们可以利用JDBC(Java Database Connectivity)API来实现这...
同时,Groovy支持定义脚本并使用`GroovyShell`进行解析和执行。 #### 八、Groovy安装与使用 - **安装**:从官网http://groovy.codehaus.org下载Groovy后,将获得以下可用命令: - `groovy`: 执行Groovy脚本或...
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...
这里,我们首先创建一个`GroovyClassLoader`来解析Groovy源文件,然后通过`newInstance`方法实例化Groovy类,并使用`invokeMethod`来调用特定的方法。 这种Java与Groovy的交互能力使得开发者可以灵活地利用两种语言...
通过上述步骤,您已经完成了在 Eclipse 中安装 Groovy 插件的过程,并学会了如何使用 Groovy 进行基本的编程操作。Groovy 是一种灵活且功能强大的脚本语言,非常适合用于自动化任务、单元测试以及快速应用开发等领域...
3. **闭包(Closures)**:Groovy的闭包是其强大的特性之一,它类似于函数指针,可以作为参数传递,也可以作为返回值。闭包在处理集合操作、事件驱动编程或异步处理时非常有用。 4. **GroovyShell和...
1. **创建Groovy文件**:使用文本编辑器创建一个名为hello.groovy的文件,并输入以上代码。 2. **执行脚本**:打开命令行窗口,导航至包含hello.groovy文件的目录,然后输入`groovy hello`来运行脚本。 #### 四、...
5. 一切皆对象:Groovy 对于对象是什么类型并不关心,一个变量的类型在运行中随时可以改变。 Groovy 的优点 1. 简洁的语法:Groovy 语法简洁,减少了代码的长度,提高了编程效率。 2. 灵活性强:Groovy 是一种动态...
这篇博客“Groovy安装以及简单使用”将引导我们了解如何安装Groovy,并展示其基本用法。 首先,安装Groovy涉及几个步骤。用户需要下载最新版本的Groovy发行版,可以从Groovy官方网站...