`

groovy用AntBuidler写unit test之并导出自定义report

 
阅读更多

 

 

背景:

 

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自定义函数实现提取明细表字段至主表字段.rar

    本案例聚焦于使用Groovy脚本语言来实现一个特定的功能:从明细表中提取字段值,并将其更新到主表对应的字段中。这样的操作对于数据同步、报表生成以及业务流程自动化等场景非常常见。 Groovy是一种动态、灵活的Java...

    groovy代码-groovy test

    在“groovy代码-groovy test”这个主题中,我们主要会探讨Groovy语言的基本概念、语法特点以及如何进行测试。 1. **Groovy基本概念** - **动态类型**:Groovy是动态类型的,这意味着变量的类型是在运行时确定的,...

    Java调用Groovy,实时动态加载数据库groovy脚本

    3. 加载并执行Groovy脚本:通过GroovyClassLoader的`parseClass()`方法解析Groovy源码,然后使用`newInstance()`方法创建脚本实例,最后通过`invokeMethod()`方法执行脚本中的方法。 在Java与MongoDB的交互中,我们...

    Groovy学习资料

    此外,Groovy还有闭包(Closure)的概念,这是Groovy强大的功能之一,它可以用来处理函数式编程任务,如数据过滤和映射。 其次,Groovy的动态特性是另一个关键知识点。Groovy可以在运行时改变类的结构,这意味着你...

    用Groovy更迅速地对Java代码进行单元测试

    JavaGroovy用Groovy更迅速地对Java代码进行单元测试软件测试不久以前,developerWorks的作者AndrewGlover撰写了一篇介绍的文章,该文章是alt.lang.jre系列的一部分,而Groovy是一个新提议的用于平台的标准语言。...

    groovy-2.3.6-installer

    安装Groovy后,开发者可以使用Groovy Shell(groovysh)进行交互式编程,或者编写Groovy脚本执行任务。Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发...

    groovy in action 中文版 2017.11

    Groovy是完全兼容Java的,这意味着Java开发人员可以轻松地使用Groovy编写程序,并利用Groovy提供的强大功能简化开发流程。 Groovy能够为脚本编写人员提供一种更直接、更易于表达的编程方式。脚本编写人员可以使用...

    groovy入门经典,groovyeclipse 插件

    Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...

    groovy脚本实现对数据库的增删改查

    在“groovy脚本实现对数据库的增删改查”这个主题中,我们将深入探讨如何使用Groovy来执行常见的数据库操作。首先,我们需要连接到数据库。在Groovy中,我们可以利用JDBC(Java Database Connectivity)API来实现这...

    groovy速查手册

    同时,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版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...

    Java中使用Groovy的三种方式

    本文将深入探讨在Java项目中使用Groovy的三种主要方式,并阐述它们各自的优势和应用场景。 一、作为嵌入式脚本 Java 6引入了JSR 223(Scripting for the Java Platform),允许在Java程序中直接执行脚本语言。...

    groovy和Java相互调用1

    这里,我们首先创建一个`GroovyClassLoader`来解析Groovy源文件,然后通过`newInstance`方法实例化Groovy类,并使用`invokeMethod`来调用特定的方法。 这种Java与Groovy的交互能力使得开发者可以灵活地利用两种语言...

    eclipse安装groovy插件的步骤

    通过上述步骤,您已经完成了在 Eclipse 中安装 Groovy 插件的过程,并学会了如何使用 Groovy 进行基本的编程操作。Groovy 是一种灵活且功能强大的脚本语言,非常适合用于自动化任务、单元测试以及快速应用开发等领域...

    某些必要的groovy

    3. **闭包(Closures)**:Groovy的闭包是其强大的特性之一,它类似于函数指针,可以作为参数传递,也可以作为返回值。闭包在处理集合操作、事件驱动编程或异步处理时非常有用。 4. **GroovyShell和...

    Groovy Script 入门

    1. **创建Groovy文件**:使用文本编辑器创建一个名为hello.groovy的文件,并输入以上代码。 2. **执行脚本**:打开命令行窗口,导航至包含hello.groovy文件的目录,然后输入`groovy hello`来运行脚本。 #### 四、...

    Groovy入门教程[参照].pdf

    5. 一切皆对象:Groovy 对于对象是什么类型并不关心,一个变量的类型在运行中随时可以改变。 Groovy 的优点 1. 简洁的语法:Groovy 语法简洁,减少了代码的长度,提高了编程效率。 2. 灵活性强:Groovy 是一种动态...

    Groovy安装以及简单使用

    这篇博客“Groovy安装以及简单使用”将引导我们了解如何安装Groovy,并展示其基本用法。 首先,安装Groovy涉及几个步骤。用户需要下载最新版本的Groovy发行版,可以从Groovy官方网站...

Global site tag (gtag.js) - Google Analytics