前言
用过Jmeter的童鞋肯定都听说过Beanshell,BeanShell是一种松散类型的脚本语言(和JS类似),一种完全符合java语法的java脚本语言,但其也拥有自己的语法和方法,足以可见其功能的强大。更让你吃惊的是,TestNG居然可以同Beanshell结合,构建强大的testng.xml配置。
环境配置
登录beanshell官网下载bsh-2.0b4.jar,放到$JAVA_HOME/jre/lib/ext目录下。更详细的说明可以参考beanshell手册。
To install as an extension place the bsh.jar file in your
$JAVA_HOME/jre/lib/ext folder. (OSX users: place the bsh.jar in
/Library/Java/Extensions or ~/Library/Java/Extensions for individual users.)
Or add BeanShell to your classpath like this:
windows: set classpath %classpath%;bsh-xx.jar
示例
当在<script>标签出现在testng.xml时,TestNG将忽略当前test标签下的组和方法的<include>,<exclude>标签,您的BeanShell表达式将是决定是否执行测试方法的唯一因素。
编写测试类如下:
import org.testng.Assert;
import org.testng.annotations.*;
@Test(groups = "test1")
public class TestNGHelloWorld1 {
@BeforeTest
public void bfTest() {
System.out.println("TestNGHelloWorld1 beforTest!");
}
@Test(expectedExceptions = ArithmeticException.class, expectedExceptionsMessageRegExp = ".*zero")
public void helloWorldTest1() {
System.out.println("TestNGHelloWorld1 Test1!");
int c = 1 / 0;
Assert.assertEquals("1", "1");
}
@Test()
@Parameters(value = "para")
public void helloWorldTest2(@Optional("Tom")String str) {
Assert.assertEquals("1", "1");
System.out.println("TestNGHelloWorld1 Test2! "+ str);
}
@AfterTest
public void AfTest() {
System.out.println("TestNGHelloWorld1 AfterTest!");
}
}
testng.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite" group-by-instances="true">
<test verbose="2" preserve-order="true" name="Test">
<method-selectors>
<method-selector>
<script language="beanshell">
<![CDATA[
groups.containsKey("test1")
]]>
</script>
</method-selector>
</method-selectors>
<classes>
<class name="TestNGHelloWorld1"/>
</classes>
</test>
</suite>
执行结果如下:
TestNGHelloWorld1 beforTest!
TestNGHelloWorld1 Test1!
TestNGHelloWorld1 Test2! Tom
TestNGHelloWorld1 AfterTest!
===============================================
All Test Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
由此可见,beanshell可让测试/开发人员更灵活地对testng.xml进行配置。但需要关注以下几点:
- 它必须返回一个布尔值。除了这个约束之外,还允许任何有效的BeanShell代码(例如,您可能想在工作日期间返回true,在周末返回false,这将允许您根据日期以不同的方式运行测试)。
- 为了方便起见,TestNG定义了以下变量:
java.lang.reflect.Method method: 当前的测试方法
org.testng.ITestNGMethod testngMethod: 当前测试方法的描述
java.util.Map<String, String> groups: 当前测试方法所属组的映射
上述testng.xml的groups.containsKey返回的正是布尔值。
扩展学习资料
关于beanshell的学习,可参考beanshell手册。
网友评论