这个是我后来写的一本书,http://www.ituring.com.cn/minibook/10775。这个是我后来找到的自动化完美解决方案。
最后一章我们说下多线程,在前面我们已经说完如何分布式执行脚本,那在里面引入多线程并发执行case,也十分简单。
第一,我们创建一个线程类,构造器中传入要执行的脚本和要输出目录。在run方法体内让执行这个脚本。
public class BThread implements Runnable {
public BThread(String outputDir, BertTestCase bte){
}
@Override
public void run() {
bte.execute();
}
}
在外部我们写一个测试类来测试它。
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(10);
for(int i=0;i<list.size();i++){
exec.execute(BThread(logputDir,list.getCase()));
}
exec.shutdown();
}
}
这段代码意思很简单,首先我们构建一个最大数有10个线程的线程池,然后再线程池中运行分布式分发过来的脚本,脚本以10个为一批的运行。
后来客户提出需求,他希望程序失败的时候能自动截取当前屏幕图像。这点也很简单,在创建一个监听线程。
import org.apache.log4j.Logger;
public class BMonitorThread implements Runnable {
private Logger log = null;
private BertThread bThread = null;
public BMonitorThread(BertThread t) {
bThread = t;
}
@Override
public void run() {
try {
bThread.start("");
} catch (Exception ex) {
log.error(this.getClass().getName() + ":: Exception in monitor thread -> ", ex);
} finally {
captureScreenShot();
}
}
public void captureScreenShot() {
// in this area use selenium captureScreen function
}
}
那么我们外围测试类修改成这样就行了
public static void main(String[] args) {
ExecutorService exec = Executors.newFixedThreadPool(10);
for(int i=0;i<list.size();i++){
exec.execute(BMonitorThread(BThread(logputDir,list.getCase())));
}
exec.shutdown();
}
好的,在项目中的基本并发情况说完,但是在实际中,我并不鼓励企业自己写并发程序,因为难以调试和把代码写正确。在之前一章用了ActiveMQ其实就是非常好的选择,他把所有的并发都自己实现了。我们主要调用就ok, 即使在本项目中,我也发现了多线程很多使用不当的地方,比如用ReentrantLock存在这没有正确释放锁的情况:既没遵守按照以下情况,这都是在代码中难以检测到的隐患。
lock.lock();try {
//coding
} finally {
lock.unlock();
}
后记
我在工作的这段日子里,也在反思和比较各种自动化框架的优缺点,我有个朋友在另一家公司做自动化,他告诉我他们的自动化框架有1.5G,原因是他们代码不能重用,所以代码越积越多。在项目开发中,一定要重视代码的重用,在我前面第一部分讲述的自动化语言中,没有提到代码的模板化调用。但是我们在开发框架中要想到这一层,可以写脚本模板供别的脚本调用。
最后再总结下自动化框架,
一,一定要开发好供使用者容易调用的语言。
二,log管理,输出你指定格式的记录,你如果在此架设上一个BI图表系统专门用来分析管理报告那就更好。
三,测试脚本的管理,什么时候运行哪批次脚本。
四,低次分布式任务处理系统。让任务能分配到好多台机器上执行。如果你机器吞吐量不够可以加上并发执行功能。