上一边文章中,all_tests.py文件与测试用例都位于同一文件见。下面通过在测试用例文件夹下添加__init__.py形成包文件,然后再all_test.py中添加PATH路径导入包即可。具体操作如下:
1、在test_case文件夹下新建__init__.py文件,
import baidu
import youdao
#coding = utf-8
import unittest
#把test_case 目录添加到path 下,这里用的相对路径
import sys
sys.path.append(r"F:\技术提高学习\自动化框架\web自动化\实例\实例6.1_unittest通过测试套件组织用例\test_case")
#from test_case import baidu, youdao 若__init.py内容为空,需手动导入模块
from test_case import *
import HTMLTestRunner
import time
testunit = unittest.TestSuite()
#将测试用例加入到测试容器(套件)中
testunit.addTest(unittest.makeSuite(baidu.Baidu)) #弊端:随着用例的增加,测试套件可能要罗列几百上千条用例,不便于管理
testunit.addTest(unittest.makeSuite(youdao.Youdao))
#coding = utf-8
import unittest
import sys
sys.path.append(r"F:\技术提高学习\自动化框架\web自动化\实例\实例6.1_unittest通过测试套件组织用例\test_case")
from test_case import *
import HTMLTestRunner
import time
#将用例组装数组
alltestnames = [baidu.Baidu, youdao.Youdao] #弊端:每次新增或删除用例时,都要改动该文件
#创建测试套件
testunit = unittest.TestSuite()
for test in alltestnames:
testunit.addTest(unittest.makeSuite(test))
解决方案:把alltestnames 数组放到一个单独的文件中,创建allcase_list.py 文件,与all_tests.py 保持同级目录
新增allcase_list.py
#coding = utf-8
import sys
sys.path.append(r"F:\技术提高学习\自动化框架\web自动化\实例\实例6.1_unittest通过测试套件组织用例\test_case")
from test_case import *
#用例文件列表
def caselist():
alltestnames = [
baidu.Baidu,
youdao.Youdao
]
print('success read case list!')
return alltestnames
import allcase_list
#获取数组方法
alltestnames = allcase_list.caselist()
问题:如新建一条用例aaa.py,仍需要改动两个文件__init__.py、allcase_list.py
需要在用例当前目录下打开__init__.py 文件,添加“import aaa”;
还需要打开allcase_list.py 文件,在alltestnames 数组中添加aaa.calss_name 。然后,用例才能添加到测试套件中执行。
原因:引入了HTMLTestRunner测试报告,需要用runner.run(testunit)(否则可以直接用unittest.main()来执行)
解决方案:TestLoader 下的discover()方法来实现,以通过文件的名称来判断是否为测试用例文件,如为用例文件则自动添加到测试套件中
1、删除__init__.py、allcase_list.py文件
2、重命名待测测试用例,命名规则符合discover函数规则
3、修改all_tests.py
#coding = utf-8
import unittest
import HTMLTestRunner
import time, os
listcasedir = r"F:\技术提高学习\自动化框架\web自动化\实例\实例6.2_unittest通过testloader加载用例\test_case"
def creatsuitel():
testunit = unittest.TestSuite()
#discover方法定义
discover = unittest.defaultTestLoader.discover(listcasedir, pattern ='start*.py', top_level_dir = None)
#discover 方法筛选出来的用例,循环添加到测试套件中
for test_suite in discover:
for test_case in test_suite:
testunit.addTests(test_case)
print(testunit)
return testunit
alltestnames = creatsuitel()
now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time()))
filename = r"F:\技术提高学习\自动化框架\web自动化\实例\实例6.2_unittest通过testloader加载用例\{0}result.html".format(now)
print(filename)
fp = open(filename, 'wb')
#执行测试用例
runner = HTMLTestRunner.HTMLTestRunner(stream = fp, title = '百度搜索测试报告', description = '测试执行情况')
runner.run(alltestnames)
语法点:
TestLoader:测试用例加载器,其包括多个加载测试用例的方法。返回一个测试套件。
discover(start_dir,pattern='test*.py',top_level_dir=None)
找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。
如果启动的不是顶层目录,那么顶层目录必须要单独指定。
start_dir :要测试的模块名或测试用例目录。
pattern='test*.py' :表示用例文件名的匹配原则。星号“*”表示任意多个字符。