Junit作为java自动化测试利器,在java软件开发方面有着强大的功能和便利。通过大量的单元测试,可以方便的定位错位,而且可以提高自己对代码的信心。单元的颗粒度可以小到是一个函数,也是大到是一个类,甚至更大,但是,在单元测试时,由于junit的设计,它对于runnable的对象是忽略的,所以,在我们的测试过程中,对于多线程的测试就变得困难和不可行。但是,在有些项目中,对多线程的测试又是必须的,难以两全么?现在有了 groboutils,这一切就变得轻松方便了。
在一些单元测试时,我们有可能需要调用一些类的线程,但是,在junit原有的模型上,要么 runnable对象被忽略了,要么就得调用它的run()方法,但是,这样的调用也就失去了并发性,在想要查看线程之间的调度时,这样的功能是不够的。
首先来看一段简单的代码,我们有个类来计算pi,还有个去查看即时的pi值。
//class 'calculate pi'
public class pi extends Thread {
volatile double pi;
public double getPi() {
return this.pi;
}
public void setPi(double pi) {
this.pi = pi;
}
public void run() {
calPI();
}
private double calPI() {
boolean negative = true;
for (int i = 3; i < Long.MAX_VALUE; i += 2) {
if (negative)
pi -= (1.0 / i);
else
pi += (1.0 / i);
negative = !negative;
}
pi += 1.0;
pi *= 4.0;
return this.pi;
}
public pi() {
start();
}
}
//class view the value of pi
public class observer extends Thread {
pi pi;
observer(pi pi) throws InterruptedException {
this.pi = pi;
System.out.println("Start to calculate pi");
start();
}
public void run() {
while (true) {
double zz = pi.pi;
try {
Thread.sleep(1000);
System.out.println((zz + 1) * 4);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
然后,我们进行junit测试。
//测试类
import junit.framework.TestCase;
public class observerTest extends TestCase {
protected void setUp() throws Exception {
}
protected void tearDown() throws Exception {
}
public void testObserver() throws InterruptedException {
pi temp = new pi();
new observer(temp);
}
}
很不幸,我们发现,在构造函数初始化时,它忽略了start(),就直接结束了。这显然不是我们想要的结果,在junit中,对于线程,显然是不支持的。好在有了groboutils,这一些就变得方便和轻松了。作为在junit的框架下面的扩展,如果想要使用支持线程的测试,线程要继承 TestRunnable这个类,并且重载这个类的runTest方法来代替原来的run();进行多线程测试时,通过 MultiThreadedTestRunner来控制线程的启动,先给出改写后的类。
//改写后的pi计算
import net.sourceforge.groboutils.junit.v1.TestRunnable;
public class testpi extends TestRunnable {
volatile double pi;
public double getPi() {
return this.pi;
}
public void setPi(double pi) {
this.pi = pi;
}
public void runTest() {
calPI();
}
private double calPI() {
boolean negative = true;
for (int i = 3; i < Long.MAX_VALUE; i += 2) {
if (negative)
pi -= (1.0 / i);
else
pi += (1.0 / i);
negative = !negative;
}
pi += 1.0;
pi *= 4.0;
return this.pi;
}
public testpi() {
}
}
//改写后的ob
import net.sourceforge.groboutils.junit.v1.TestRunnable;
public class testob extends TestRunnable {
testpi pi;
testob(testpi pi) throws InterruptedException {
this.pi = pi;
System.out.println("Start to calculate pi");
}
public void runTest() {
while (true) {
double zz = pi.pi;
try {
Thread.sleep(1000);
System.out.println((zz + 1) * 4);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//改写后的测试类
import net.sourceforge.groboutils.junit.v1.MultiThreadedTestRunner;
import net.sourceforge.groboutils.junit.v1.TestRunnable;
import junit.framework.TestCase;
public class groboutil_test1 extends TestCase {
public void testobserver() throws Throwable {
TestRunnable tr1,tr2;
tr1=new testpi();
tr2=new testob((testpi)tr1);
TestRunnable[] trs={tr1,tr2};
MultiThreadedTestRunner mttr = new MultiThreadedTestRunner(trs);
mttr.runTestRunnables();
}
}
可以看到,这样,程序又可以正常的启动测试了。通过在testrunnable数组里面任意调用需要的线程, MultiThreadedTestRunner会自己等待所有的线程执行完毕退出后才继续,所以,我们不必自己调用线程的start(),来启动线程,而且交给 MultiThreadedTestRunner来统一调度,它会统一为线程启动进行异步控制。对于测试者而言,只需把注意力放在自己关注的单元测试上。并且,它还提供了delay(),isDone()等方法,进一步方便测试者的调试。
有了GroboUtils,多线程测试从此变得简单而快乐。
GroboUtils链接:http://groboutils.sourceforge.net/
分享到:
相关推荐
《groboutils:多线程测试组件的卓越选择》 在软件开发过程中,单元测试是确保代码质量的重要环节。它允许开发者对程序中的每个模块进行独立验证,从而尽早发现和修复潜在问题。然而,随着多线程编程的普及,传统的...
GroboUtils是一个专门为了解决JUnit在多线程测试中遇到问题的扩展库。它提供了额外的功能,帮助开发者有效地编写和执行多线程单元测试,以确保在并发环境下代码的正确性和稳定性。 首先,GroboUtils为JUnit提供了一...
GroboUtils-5.zip这个压缩包很可能包含了一些辅助进行Java多线程测试的工具或者库。 Java多线程允许程序同时执行多个任务,提高系统的效率和资源利用率。在Java中,实现多线程主要有两种方式:通过继承Thread类或...
总之,GroboUtils-5-core.jar是Java开发者进行多线程测试时的得力助手,它以丰富的功能、简洁的API和深度的Junit集成,降低了多线程测试的复杂性和难度,提高了测试的覆盖率和可靠性。无论你是经验丰富的测试工程师...
GroboUtils-3 是一个专为进行多线程测试而设计的工具包,它提供了丰富的功能和接口,帮助开发者在复杂的应用场景下测试并优化多线程程序的性能和稳定性。在多线程编程中,确保并发执行的正确性和效率至关重要,因为...
标题 "groboutils" 指的可能是一个开源工具库,主要用于多线程编程和测试,其中包含了一个核心组件 "groboutils-core-5.jar"。这个库的版本号为5,暗示了它可能经过多次迭代和优化,以提供更好的性能和稳定性。这个...
本文将深入探讨`groboutils-core-5`的主要特性和使用方法,以及其如何支持多线程测试。 首先,`groboutils-core-5`的核心在于其对Java单元测试的全面支持。单元测试是验证软件最小可独立运行单元的过程,如方法或类...
GroboUtils-5-core 是一个专门针对Java开发的测试工具包,主要目的是为了简化和加速Junit测试中的多线程并发测试。这个工具包的核心功能是帮助开发者在编写测试用例时,能够轻松地创建和管理多线程环境,从而确保在...
groboutils-core-5.jar 单元测试多线程
这种测试通常会模拟多个用户同时访问系统,以检测潜在的线程安全问题、资源管理问题以及在高压力环境下的性能瓶颈。这一步对于确保软件在生产环境中能够可靠运行至关重要。 “自测jar包没有问题”意味着发布者已经...
这个主题主要涉及如何在多线程环境下测试程序的性能、稳定性和正确性。在这个场景下,`MutiThreadTest.java` 文件可能是用于实现并发测试的代码,而 `GroboUtils-5-core.jar` 包可能包含了辅助进行并发测试或处理...