unittest框架
1、unittest 是方便规范编写测试用例和后期维护;
2、unittest 是python中自带的库
3、unittest框架的结构:
import unittest
class Kj(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法的结束")
def test1dl(self):
print("11")
def test3dl(self):
print("333")
def test2dl(self):
print("222")
def testadl(self):
print("aaa")
def testAdl(self):
print("AAA")
def dy(self): #独有的方法
print("独有")
if __name__ == '__main__':
unittest.main()
备注:
1、运行的用例要是test开头(不是test开头的就无法识别)
2、运行规则0-9,A-Z,a-z 是按ASCLLMA顺序执行
3、类的开始和类结束就执行一次
4、方法的开始方法结束,每条用例都执行
unittest 的讲解
第一种调用所有的用例:
import unittest
class Kj(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法的结束")
def test1dl(self):
print("11")
def test3dl(self):
print("333")
def test2dl(self):
print("222")
def testadl(self):
print("aaa")
def testAdl(self):
print("AAA")
def dy(self): #独有的方法,不是test开头就无法运行
print("独有")
if __name__ == '__main__':
unittest.main()
第二种调用部分的用例或单个用例:
import unittest
class Kj(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法的结束")
def test1dl(self):
print("11")
def test3dl(self):
print("333")
def test2dl(self):
print("222")
def testadl(self):
print("aaa")
def testAdl(self):
print("AAA")
def dy(self): #独有的方法
print("独有")
if __name__ == '__main__':
# unittest.main() #执行所有的用例
tj=unittest.TestSuite() #创建一个TestSuite的对象
tj.addTest(Kj("test3dl"))
unittest.TextTestRunner().run(tj) # 运行用例
注意运行的过程种还是运行5条:是因为解释器
解决方法:
1、复制文档当前路径:C:\Users
Administrator.USER-20231114RR\PycharmProjects\untitled8\bao\kj.py
2、在编辑器种编辑
3、在python种添加模块的路径
4、运行指定用例
b、运行2条或2条以上的用例
import unittest
class Kj(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法的结束")
def test1dl(self):
print("11")
def test3dl(self):
print("333")
def test2dl(self):
print("222")
def testadl(self):
print("aaa")
def testAdl(self):
print("AAA")
def dy(self): #独有的方法
print("独有")
if __name__ == '__main__':
# unittest.main() #执行所有的用例
tj=unittest.TestSuite() #创建一个TestSuite的对象
tj.addTests([Kj("test3dl"),Kj("test2dl")])
unittest.TextTestRunner().run(tj) # 运行用例
第三种调用一个路径的用例:
import unittest
class Kj(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法的结束")
def test1dl(self):
print("11")
def test3dl(self):
print("333")
def test2dl(self):
print("222")
def testadl(self):
print("aaa")
def testAdl(self):
print("AAA")
def dy(self): #独有的方法
print("独有")
if __name__ == '__main__':
# unittest.main() #执行所有的用例
# tj=unittest.TestSuite() #创建一个TestSuite的对象
# tj.addTests([Kj("test3dl"),Kj("test2dl")])
# unittest.TextTestRunner().run(tj) # 运行让用例
lj=r"C:\Users\Administrator.USER-20231114RR\PycharmProjects\untitled8\bao"
d=unittest.TestLoader().discover(start_dir=lj,pattern="kj*.py")
unittest.TextTestRunner().run(d)
第四种调用一个路径的用例并生成测试报告:
1、下载好报告模板,将模板放在包下
2、
import unittest
import time
from bao.HTMLTestRunnerNew import HTMLTestRunner
class Kj(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法的结束")
def test1dl(self):
print("11")
def test3dl(self):
print("333")
def test2dl(self):
print("222")
def testadl(self):
print("aaa")
def testAdl(self):
print("AAA")
def dy(self): #独有的方法
print("独有")
if __name__ == '__main__':
# unittest.main() #执行所有的用例
# tj=unittest.TestSuite() #创建一个TestSuite的对象
# tj.addTests([Kj("test3dl"),Kj("test2dl")])
# unittest.TextTestRunner().run(tj) # 运行让用例
# lj=r"C:\Users\Administrator.USER-20231114RR\PycharmProjects\untitled8\bao"
# d=unittest.TestLoader().discover(start_dir=lj,pattern="kj*.py")
# unittest.TextTestRunner().run(d)
bglj=r"C:\Users\Administrator.USER-20231114RR\PycharmProjects\untitled8\bao"
lj=r"C:\Users\Administrator.USER-20231114RR\PycharmProjects\untitled8\bao"
d=unittest.TestLoader().discover(start_dir=lj,pattern="kj*.py")
new=time.strftime("%y-%m-%d %H-%M-%S") #时间戳
file=bglj+"/"+str(new)+"_ui.html" #生成报告的路径+报告的命名+报告的后缀
f=open(file,"bw") #打开文件,以二进制的方法写入
r=HTMLTestRunner(
stream=f,title="ui自动化测试报给" ,description="用例执行情况",tester="dcs"
)
r.run(d)
讲解:
只讲解结构
要引用一个python自带的unittest代码包,然后开始定义测试类,给一个unittest.TestCase的参数,
方法里必须要有setUp,和tearDown方法作为测试开始的前置条件和结尾,也可以有setupclass和
teardownclass作为类的开始和结尾,然后写出要测试的方法.
使用:1.用main()直接全部调用
2.用unittest里一个叫做TestSuite()的方法创建容器,然后用addTest在容器里加入要执行的方法
然后用TextTestRunner创建执行对象,然后用run()方法执行
3.用路径执行,用testloader().discover()定位
4.使用路径执行并输出测试报告,要用到测试报告的模板通过路径执行将结果按照模板生成报告
结合案例讲解
Unittest框架介绍
Unittest属于python标准库里的一个模块,主要包括test case。
TestCase ------------------ 测试用例
TestSuite ---------------套件,可以把用例封装在一起的一个容器
TestLoader -------------创建文件,用来搜索所有以test开头的测试用例文件
TextTestRunner-----------------执行用例,里面包括run()方法
TestResult--------------储存执行用例结果的
Unittest框架结构分为三部分:
(1)首先是setup部分用于设计初始化环境的,该类中方法执行的时候都会先执行setup中的代码。
(2)运行部分:这里是编写测试用例的地方所有的用例命名都需要用test开头
(3)最后是teatdown部分:这里是用例执行完后还原测试环境的。
Unittest流程:
以保险流程为例,首先导入unitttest模块,selenium.webdriver模块,time模块,然后创建一个类class继承unittest.testcase,以setup开头,setup初始化测试环境是每个用例执行之前调用,所以我们在setup函数里,可以将我们初始化网页的方法写进去,之后我们写第一条用例,每条用例必须以test开头来命名,这里我写了一个changewindow函数用来切换网页,然后依次执行用例,teardown函数是每次执行完用例调用的还原测试环境的函数。
然后调用主函数main作为unittest的入口,我们用搜索路径的方法执行自动化,调用unittest.testloader.discover方法执行用例;或者直接调用所有的用例方法unittest.main();
再生成一个测试报告:
首先以相对路径的方式定义生成测试报告的位置和文件名(可以用time模块中的strtime()方法,为文件加时间格式),再用open(路径,“wb”)方法创建并打开文件,我们这里需要先导入HTMLTestRunner3_New中的HTMLTestRunner类,用来生成测试报告的(From hz6(包名).HTMLTestRunner3_New import HTMLTestRunner) ,再用里面的run()函数来执行用例
框架总结:
结构:
Import unittest #导入模块
class XX(unittest.TestCase): #定义类
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None: #方法的开始(初始化测试)
.....
def tearDown(self) -> None: #方法的结束(还原测试环境)
.....
def test001(self): #定义测试用例
测试用例1
def test002(self):
测试用例2
......
if name == 'main':
调用方法:
(1)运行所有用例:
unittest.main()
(2)以下方法是添加用例到一个套间中,再执行用例:
suit=unittest.TestSuite() #创建一个套件(容器)
suit.addTest(XX("test_a")) #添加单个用例选择
suit.addTests([XX("test_a"),XX("test_1")]) #添加多个用例选择
run=unittest.TextTestRunner() #创建一个执行对象
run.run(suit) #通过对象调用run方法来运行选择的用例
(3)根据路径自动搜索用例执行:
Path=r’相对路径’
a=unittest.TestLoader().discover(start_dir=path,pattern=‘a*.py’)
Runner=unittest.TextTestRunner() #创建一个执行对象
Runner.run(a) #通过对象调用run方法来运行搜索到的用例
(4)自动搜索+生成测试报告:
(From hz6(包名).HTMLTestRunner3_New import HTMLTestRunner) #导入HTMLTestRunner类,用来生成测试报告的
(from time import *) #导入time模块
Path=r’相对路径’
a=unittest.TestLoader().discover(start_dir=path,pattern=’a*.py’)
now=strtime("%Y-%m-%d-%H-%M-%S") #输出报告文本时间格式
bg=r’相对路径’+’/’+str(now)+’_ui.html’ #测试报告文本的格式化
filename=open(bg,"wb") #写入文件内容
runner=HTMLTestRunner(stream=filename,title="ui自动化测试报告",
description="用例执行情况",tester="px")
runner.run(d) #运行
unittest单元测试框架的总结:
1.只会运行以test开头的用例
2.test后面的运行顺序以ASCII码为准 0-9 A-Z a-z
3.类开始和类结束只会运行一次
TestCase:
一个Testcase的实例就是一个测试用例,测试用例就是一个完整的测试流程,包括初始化setUp、运行run、测试后的还原tearDown(字面意思,测试用例。为一个或多个方法提供测试方法。一般是一个test)
TestSuite:
对一个功能的测试往往需要多测试用例的,可以把多的测试用例集合在一起执行,这就是TestSuite的概念。常用addTest()方法将一个测试用例添加到测试套件中(测试集合,即一组测试。一个test suite是把多个相关测试归入一组的快捷方式)
TextTestRunner:
是用来执行测试用例的,其中的run(test)用来执行TestSuite/TestCase。测试的结果会保存在TextTestResult实例中(测试运行器。执行test suite的程序)
TestFixture:
测试准备前要做的工作和测试执行完后要做的工作.包括setUp()和tearDown()。通过覆盖TestCase的setUp和tearDown来实现(就是运行被测软件所需要的一切东西,这个“东西”不单只是数据,同时还包括对被测软件的准备,例如实例化某个被测方法所在的类,准备数据库的ConnectionString等)
TestLoader:
是用来搜索所有以test开头的测试用例,然后将其加入到testsuite中
三、注意点:
1、单词的解释
TextTestRunner:执行用例,里面包括run()方法,
TestLoader:测试路径
TestSuite:套件,可以把用例封装到一起
TestCase:一个测试用例
addtest:添加用例
标签:None,框架,unittest,用例,print,self,def From: https://www.cnblogs.com/fujintao/p/18360412