您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > junit
了解JUnit核心类、接口及生命周期
作者:网络转载 发布时间:[ 2013/8/29 15:25:33 ] 推荐标签:

两种不同参数运行 TestCase

参数 1:

输入:

Java代码

    >java junit.textui.TestRunner  TestShoppingCart 

输出:

Up
testPay!
Down
Up
testPayWithDiscount!
Down

参数 2:

输入:

Java代码

    > java junit.textui.TestRunner -m TestShoppingCart.testPayWithDiscount 

输出:

Up
testPayWithDiscount!
Down

参数 1:TestCase 名字,该类的所有的以 test 开头的 public 方法都会执行。

参数 2:参数 -m,仅仅运行该类的该方法。

TestRunner 还提供了其他的参数 -wait:(大响应时间),-v:查看 JUnit 版本号。从输出可以看出,参数一: testPay(),testPayWithDiscount() 都运行;参数二:仅仅运行参数中的 testPayWithDiscount()。对比两个输出结果,setUp() 在每个方法运行前运行一次,teardown() 在每个方法运行后执行一次。后面将会详细介绍。

TestRunner 处理两种不同的参数

TestRunner main() 方法中,生成一个 TestRunner 实例,调用 start(args) 方法。在 start 方法中,JUnit 对输入参数进行处理,首先检查 -m、-v、-wait 等参数,对他们分别进行处理。如果有 -m 参数,将会根据“.”的位置,分割得到 className 和 methodName.

参数一:

首先调用 getTest(),通过 Java 反射实例化 TestSuite:

Class testClass = Class.forName(suiteClassName).asSubclass(TestCase.class);

new TestSuite(testClass)

TestSuite 构造函数中,通过调用 Class.getDeclaredMethods(),得到这个类的所有 Public 的方法,当然也包括构造函数,test 开头和非 test 开头的 public 方法。对所有方法进行过滤,仅仅保留 public 并且以“test”开头的方法,本例中为 testPay() 和 testPayWithDiscount()。然后分别调用 TestSuite 的 createTest() 为每个方法生成一个实例:

theClass.getConstructor(String.class).newInstance(new Object[0]);

并且都保存在 Vector<Test> fTests 中。

参数二:

与方法一不同的的是,并不通过反射获得相应的方法,因为参数中指定了特定的方法。直接根据输入参数调用 TestSuite 的 createTest(),通过反射直接生成 TestCase 实例。

TestCase 实例的运行

生成 TestCase 实例后,两种参数都将调用 TestRunner 的 doRun() 方法。下面将对第二种参数进行详细介绍,介绍一个 TestCase 实例是怎么运行的,并且怎样与 TestResult 和 TestListener 结合。

在 doRun() 方法中,实例化 TestResult result, 为 result 加上 Listener (new ResultPrinter()),用来监听 Test 运行中的事件。然后运行 TestResult.Run(test)。run() 方法中调用 TestCase 的 runBare()。runBare() 会把所有的异常都抛出来,result 将接受到所有的异常。runBare() 首先会运行 setup(),接着运行 runTest(), 后 tearDown()。回头再看前面的 output,明白了为什么 setup() 和 tearDown() 会在每个方法运行前和后运行,对于参数二,运行了两次。

上一页1234下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd