一、什么是UnitTest?
1、介绍
unittest是Python自带的一个单元测试框架,它可以做单元测试,也能用于编写和运行重复的测试工作。
它给自动化测试用例开发和执行提供了丰富的断言方法,判断测试用例是否通过,并最终生成测试结果。
2、核心要素
- TestCase
- TestSuite
- TestLoader
- Fixture
- TestRunner
二、简单使用UnitTest
1、简单分层
测试一般由三或四部分构成:被测的对象+测试用的方法+测试报告(+数据),一般有几个构成便需要几个文件
2、被测的对象
文件名:xxx.py
被测的对象可能是一段普普通通的函数
-
def A(put): # 一个普普通通的函数
-
if put == 1:
-
return "成功"
-
else:
-
return "失败"
3、测试用的方法
文件名:test.py
- 先导包:unittest包和被测对象所在的包
- 定义测试类:建一个测试类,继承unittest.TestCase
- 定义测试方法:命名为test开头
-
# 导包
-
import unittest
-
from xxx import A
-
# 定义测试类
-
class TestA(unittest.TestCase):
-
# 定义测试方法
-
def test_A_1(self):
-
self.assertEqual("成功", A(1)) # 引用被测对象
-
def test_A_2(self):
-
self.assertEqual("失败", A(2))
4、测试报告
文件名:suite.py
一般和testsuite结合,至于testsuite是什么?就是明确测试的范围,将需要被测试的用例组织起来。当然,得先用testsuite才知道报告所需要报告的用例范围
-
import unittest
-
from htmltestreport import HTMLTestReport
-
from test import TestA
-
suite = unittest.TestSuite()
-
suite.addTest(unittest.makeSuite(TestA))
-
runner = HTMLTestReport('./report.html','测试报告','描述')
-
runner.run(suite)
-
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
-
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
-
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
-
分享他们的经验,还会分享很多直播讲座和技术沙龙
-
可以免费学习!划重点!开源的!!!
-
qq群号:455787643【暗号:csdn999】
三、进阶用法
1、fixture
对一个测试用例环境的初始化和销毁
- 方法级别的 setUp(self) tearDown(self) 每个普通方法执行 之前/之后 自动运行。(运行次数和“def”的数量相关)
- 类级别的 setUpClass(cls) tearDownClass(cls) 在类内所有方法直 之前/之后 运行一次。(运行次数和“class”的数量相关)
简单来说,在测试集的首尾运行或者在每个测试用例前后执行
-
import unittest
-
from xxx import A
-
class TestA(unittest.TestCase):
-
def setUp(self) -> None:
-
print("\n前SetUp")
-
def tearDown(self) -> None:
-
print("后TearDown")
-
@classmethod
-
def setUpClass(cls) -> None:
-
print("首setUpClass")
-
@classmethod
-
def tearDownClass(cls) -> None:
-
print("尾tearDownClass")
-
def test_A_1(self):
-
print("测试_A_1")
-
self.assertEqual("成功", A(1))
-
def test_A_2(self):
-
print("测试_A_2")
-
self.assertEqual("失败", A(2))
测试结果:
-
============================= test session starts =============================
-
collecting ... collected 2 items
-
test.py::TestA::test_A_1 首setUpClass
-
PASSED [ 50%]
-
前SetUp
-
测试_A_1
-
后TearDown
-
test.py::TestA::test_A_2 PASSED [100%]
-
前SetUp
-
测试_A_2
-
后TearDown
-
尾tearDownClass
-
======================== 2 passed, 1 warning in 0.01s =========================
2、参数化
使用parameterized库
-
import unittest
-
from parameterized import parameterized # 1、引入包
-
from xxx import A
-
data = [1] # 2、设置一个参数
-
class TestA(unittest.TestCase):
-
@parameterized.expand(data) # 3、在这里注明
-
def test_A_1(self, data_in): # 4、加入对应形参
-
print("测试_A_1")
-
self.assertEqual("成功", A(data_in)) # 5、别忘记更改断点里的内容
因为parameterized库读取的数据固定为元组,格式为 [(参数), (参数), (参数)] ,其他格式的数据需要进行转化,可以添加以下方法用于读取json格式的数据
-
import json
-
# 方法一:用于打开内容为[[参数], [参数], [参数]]的文件
-
def add_1(file):
-
with open(file) as f:
-
data = json.load(f)
-
return data
-
# 方法二:用于打开内容为[{参数}, {参数}, {参数}]的文件,用的较多
-
def add_2(file):
-
with open(file, "r", encoding="utf-8") as f:
-
data_list = json.load(f)
-
new_list = []
-
for data in data_list:
-
new_list.append(tuple(data.values()))
-
return new_list
如果不是读取文件,直接读取数据并转化为元组的话,可以使用以下方法
-
import json
-
# 方法一:用于转化[[参数], [参数], [参数]]
-
def add_1(test_data):
-
data = json.load(test_data)
-
return data
-
# 方法二:用于转化[{参数}, {参数}, {参数}],用的较多
-
def add_2(test_data):
-
new_list = []
-
for data in test_data:
-
new_list.append(tuple(data.values()))
-
return new_list
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。