为实现多进程运行测试用例,我需要对文件结构进行调整:
/test_project/thread1/baidu_sta.py -----测试用例
/thread1/__init__.py
/thread2/youdao_sta.py -----测试用例
/thread2/__init__.py
/report/ ----测试报告目录
/all_tests_pro.py
我们创建 了 thread1 和 thread2 两个文件 夹,分别放入 了两个测试用 例;下面我们 编写
all_tests_process.py 文件来通过多进程来执行测试用例。
test_all_pro.py
#coding=utf-8
import unittest, time, os, multiprocessing
import HTMLTestRunner
#查找多有含有 thread 的文件,文件夹
def EEEcreatsuit():
casedir=[]
listaa=os.listdir('/home/fnngj/test_project')
for xx in listaa:
if "thread" in xx:
casedir.append(xx)
suite=[]
for n in casedir:
testunit=unittest.TestSuite()
discover=unittest.defaultTestLoader.discover(n,
pattern ='test*.py',
top_level_dir=n)
print discover
for test_suite in discover:
for test_case in test_suite:
testunit.addTests(test_case)
suite.append(testunit)
print "===casedir:====",casedir
print "+++++++++++++++++++++++++++++++++++++++++++++++"
print "!!!suite:!!!",suite
return suite,casedir
#多线程运行测试套件,将结果写入 HTMLTestRunner 报告
def EEEEEmultiRunCase(suite,casedir):
now = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
filename = '/home/fnngj/test_project/report/'+now+'result.html'
fp = file(filename, 'wb')
proclist=[]
s=0
for i in suite:
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'测试报告',
description=u'用例执行情况:'
)
proc = multiprocessing.Process(target=runner.run(i),args=(i,))
proclist.append(proc)
s=s+1
for proc in proclist: proc.start()
for proc in proclist: proc.join()
fp.close()
if __name__ == "__main__":
runtmp=EEEcreatsuit()
EEEEEmultiRunCase(runtmp[0],runtmp[1])
all_tests_pro.py 程序稍微复杂,我们分段来进行讲解。
在 EEEcreatsuite1()函数中:
test_all_pro.py
……
casedir=[]
listaa=os.listdir('/home/fnngj/test_project')
for xx in listaa:
if "thread" in xx:
casedir.append(xx)
……
定义 casedir 数组,读取 test_project 目录下的文件夹,找到文件夹的名包含“thread”的文件夹
添加到 casedir 数组中(本例中为 thread1 和 thread2 两个文件夹)。
test_all_pro.py
……
suite=[]
for n in casedir:
testunit=unittest.TestSuite()
discover=unittest.defaultTestLoader.discover(n,
pattern ='test*.py',
top_level_dir=n)
print discover
for test_suite in discover:
for test_case in test_suite:
testunit.addTests(test_case)
suite.append(testunit)
……
定位 suite 数组,for 循环读取 casedir 数组中的数据(即 thread1 和 thread2 两个文件夹)。通过
discover 分别读取文件夹下匹配 test*.py 规则的用例文件,将所有用例文件添加到 testunit 测试条件
中,再将测试套件追加到定义的 suite 数组中。
在整个 EEEcreatsuite1()函数中 返回 suite 和 casedir 两个数组的值。
在 EEEEEmultiRunCase 函数中:
test_all_pro.py
……
def EEEEEmultiRunCase(suite,casedir):
now = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
filename = '/home/fnngj/test_project/report/'+now+'result.html'
fp = file(filename, 'wb')
proclist=[]
s=0
for i in suite:
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'测试报告',
description=u'用例执行情况:'
)
proc = multiprocessing.Process(target=runner.run(i),args=(i,))
proclist.append(proc)
s=s+1
for proc in proclist: proc.start()
for proc in proclist: proc.join()
fp.close()
……
定义 proclist()函数,for 循环把 suite 数组中的用例执行结果写入 HTMLTestRunner 测试报告。
multiprocessing.Process 创建用例执行的多进程,把创建的多进程追加到 proclist 数组中,
for 循环 proc.start()开始进程活动,proc.join()等待线程终止。