?单元测试的本质 测试函数 代码级别的
单元测试的框架 unittest+接口学习 pytest+web学习,学习后可以运用到接口
????????unittest 是python 的单元测试框架,unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用。
????????作为单元测试的框架, unittest 也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,必须需要知道所使用语言的单元测试框架。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元, 由测试容器组织起来,到时候直接执行,同时引入测试报告。
测试步骤 :
1.写用例 TestCase
2.执行用例
2-1.TestSuite 存储用例
2-2.TestLoader 找用例,加载用例,存储到2-1的TestSuite
3.对比实际结果 预期结果 判定用例是否通过 (断言 Assert)
4.出具测试报告 TextTestRunner
注意:TestSuite和TestLoader 是类
?
1.写用例 TestCase
1.先创建一个MathMethod.py的文件,写一个MathMethod的类,如下:
class MathMethod:
def __init__(self,a,b):
self.a=a
self.b=b
def add(self): # 加法函数
return self.a+self.b
def multi(self): # 乘法函数
return self.a*self.b
2.创建一个class_01.py的文件,编写并执行测试用例
首先引用unittest,然后引用之前准备的MathMethod类,然后编写用例并执行。
?编写测试用例
1.一个用例就是一个函数 不能传参 只能有self关键字
2.所有的用例(所有的函数 都是test开头,一般是test_)*****
# 引入unittest,unittest里面有专门写测试用例的TestCase
import unittest
# 导入自己写的方法,from...import,import后面至少具体到模块名,且一层层进入
from Unittest_006.math_method import MathMethod #测试的目标
# 继承unittest里面的TestCase ,专门写用例,编写一个加法测试用例
class TestMathMethod(unittest.TestCase):
# 编写测试用例
# 1.一个用例就是一个函数 不能传参 只能有self关键字
# 2.所有的用例(所有的函数 都是test开头,一般是test_)*****
# 两个正数相加
def test_add_tow_positive(self):
# 实例调用函数,使用res存储返回值
# 实际发起请求的结果值
res=MathMethod(1,1).add()
print('1+1的结果是:',res)
# 两个负数相加
def test_add_tow_negative(self):
# 实例调用函数,使用res存储返回值
res=MathMethod(-1,-1).add()
print('-1+-1的结果是:',res)
# 两个0相加
def test_add_tow_zero(self):
# 实例调用函数,使用res存储返回值
res=MathMethod(0,0).add()
print('0+0的结果是:',res)
# 继承unittest里面的TestCase ,专门写用例,编写一个乘法测试用例
class TestMulti(unittest.TestCase):
# 编写测试用例
# 1.一个用例就是一个函数 不能传参 只能有self关键字
# 2.所有的用例(所有的函数 都是test开头,一般是test_)*****
def test_multi_tow_positive(self): # 两个正数相乘
# 实例调用函数,使用res存储返回值
res=MathMethod(1,1).multi()
print('1*1的结果是:',res)
def test_multi_tow_negative(self): # 两个负数相乘
# 实例调用函数,使用res存储返回值
res=MathMethod(-1,-1).multi()
print('-1*-1的结果是:',res)
# 执行测试用例
if __name__ == '__main__':
unittest.main()
2.执行用例
2-1.TestSuite 存储用例
创建一个class_02.py文件,引用unittest和写好测试用例的class_01模块中的类。
# 引入unittest
import unittest
# 引入class_01中的TestMathMethod类
from Unittest_006.class_01 import TestMathMethod
# A class whose instances are single test cases.
# 这个类的实例是一个个单独的测试用例
# 模块以外的地方要使用该测试用例时,需要创建实例
# TestSuite和TestLoader 是类
# TestSuite 存储用例的容器(用suite变量来存储用例)
suite=unittest.TestSuite()
# 创建测试用例时继承了unittest里面的TestCase ,专门用来写测试用例,TestCase有初始化函数,参数有methodName='runTest',即:
# class TestCase(object):
# def __init__(self, methodName='runTest'):
# methodname就是函数名,也就是上传测试用例名
# 创建实例 ---》实例.函数名(用例) ,用例需要调用TestMathMethod类中的测试用例----》用例=类(’用例名‘),建议用例少时可以使用
suite.addTest(TestMathMethod('test_add_tow_positive'))
suite.addTest(TestMathMethod('test_add_tow_negative'))
runner=unittest.TextTestRunner()
runner.run(suite)
2-2.TestLoader 找用例,加载用例,存储到2-1的TestSuite
2-2-1.从测试类里面去找测试用例
import unittest
from Unittest_006.class_01 import TestMathMethod
# TestSuite 存储用例的容器(用suite变量来存储用例)
# 存储用例用例的容器
suite=unittest.TestSuite()
# 创建一个加载器(寻找用例)
loader=unittest.TestLoader()
# 具体到类名;将寻找到的用例使用addTest方法加到suite容器里面,loadTestsFromTestCase(TestMathMethod)--->从测试名里面加载测试用例,即将TestMathMethod类里面的所有用例全部加载到addTest方法里面去
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))
runner=unittest.TextTestRunner()
runner.run(suite)
?2-2-2.从测试模块中去找测试用例
import unittest
#具体到模块名
from Unittest_006 import class_01
# 存储用例用例的容器
suite=unittest.TestSuite()
#创建一个加载器(寻找用例)
loader=unittest.TestLoader()
#loadTestsFromModule()--->从模块里面加载测试用例,此时需要引入需要的模块,在模块中找所有的用例
suite.addTest(loader.loadTestsFromModule(class_01))
runner=unittest.TextTestRunner()
runner.run(suite)
3.对比实际结果 预期结果 判定用例是否通过 (断言 Assert)
对比实际测试结果与预期是否一致时,可以在用例中添加断言
# unittest里面有专门写测试用例的TestCase
import unittest
# 导入自己写的方法,from...import,import后面至少具体到模块名,且一层层进入
from Unittest_006.math_method import MathMethod #测试的目标
# 继承unittest里面的TestCase ,专门写用例
class TestMathMethod(unittest.TestCase):
# 编写测试用例
# 1.一个用例就是一个函数 不能传参 只能有self关键字
# 2.所有的用例(所有的函数 都是test开头,一般是test_)*****
def test_add_tow_positive(self): # 两个正数相加
# 实例调用函数,使用res存储返回值
res=MathMethod(1,1).add() #实际发起请求的结果值
print('1+1的结果是:',res)
# 加一个断言:判断期望值与实际值得对比结果,一致通过,不一致失败
self.assertEqual(2,res) # 函数之间的相互调用,类里面要调用属性的是self.属性名;类里面要调用函数是self.函数名();即assertEqual()来自于父类TestCase,
if __name__ == '__main__':
unittest.main()
4.出具测试报告
4-1.原始的测试报告
import unittest
# 引入HTMLTestRunner
import HTMLTestRunner
#具体到模块名
from Unittest_006 import class_01
# 存储用例用例的容器
suite=unittest.TestSuite()
#创建一个加载器(寻找用例)
loader=unittest.TestLoader()
#loadTestsFromModule()--->从模块里面加载测试用例,此时需要引入需要的模块,在模块中找所有的用例
suite.addTest(loader.loadTestsFromModule(class_01))
# 新建文件保存执行结果,使用上下文管理器:with 打开('text.txt','w+',encoding='utf-8')这个文件存到变量file里面
# 不关闭文件会怎样? 不关闭文件有的时候要用文件时导致资源被占用
with open('text.txt','w+',encoding='utf-8') as file: # 原始的测试报告
# 执行
runner=unittest.TextTestRunner(stream=file, verbosity=2) # stream输出渠道,verbosity有3个值0,1,2,其中2是最详细的
runner.run(suite)
# 判断file是否已经是关闭状态
print(file.closed)
4-2.用html形式展示测试报告
需要引入HTMLTestRunner,python需要自己修改,可参考python3.x中导入HTMLTestRunner包_zyp--的博客-CSDN博客
import unittest
import HTMLTestRunner
from Unittest_006 import class_01
# 存储用例用例的容器
suite=unittest.TestSuite()
#创建一个加载器(寻找用例)
loader=unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(class_01))
with open('text_report.html','wb')as file:
runner=HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title='2022年8月26日学习的测试报告', description='学习自动化测试的第一份测试报告',tester='暖暖')
runner.run(suite)
|