前言
目前有两种纯测试的测试框架,pytest和unittest,这系列文章主要介绍pytest为主
UnitTest测试框架理论
- python 自带的单元测试框架,常用在单元测试
- 在自动化测试中提供用例组织与执行
- 提供丰富的断言方法-验证函数等功能
- 加上HTMLTestRunner可以生成html报告
- 官方文档 https://docs.python.org/3/library/unittest.html
官方简单的例子
import unittest
class TestStringMethods(unittest.TestCase):
# setUp代表执行函数测试前要做什么,每个函数前后都会执行一次
def setUp(self) -> None: # -> 表示返回了什么结果
print("setup")
# tearDown代表执行函数测试后要做什么
def tearDown(self) -> None:
print("teardown")
@classmethod # 下面两个实例,代表整个测试类的开始(setUpClass)前的操作和结束(tearDownClass)后的操作 只执行一次
def setUpClass(cls) -> None:
print('setUpclass---->')
@classmethod
def tearDownClass(cls) -> None:
print('tearDownClass---->')
def test_abd(self):
print('test_adb')
def test_upper(self):
print('test_upper')
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
print('test_isupper')
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
print("test_split")
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
说明:
- Unittest 提供了 test cases、 test suites、 test fixtures、 test runner等相关组件
- 编写规范
- 测试模块首先 import unittest
- 测试类必须继承 unittest.TestCase
- 测试方法必须以"test_"开头
实战:
测试一个search的类
import unittest
# 测试一个search的类
class Search:
def serch_fun(self):
print("search....")
return True
class TestSearch(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.search = Search()
print('setUpclass---->')
@classmethod
def tearDownClass(cls) -> None:
print('tearDownClass---->')
def test_search(self):
print('test_search111...')
assert True == self.search.serch_fun()
def test_searc2(self):
print('test_search222...')
assert True == self.search.serch_fun()
def test_searc3(self):
print('test_search333...')
assert True == self.search.serch_fun()
if __name__ == '__main__':
unittest.main()
Pytest简单介绍
非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
能够支持简单的单元测试和复杂的功能测试
支持参数化
执行测试过程中可以将某些测试跳过(skip),或者对某些预期失败的case标记成失败
支持重复执行(rerun)失败的 case
支持运行由 nose, unittest 编写的测试 case
可生成 html 报告
方便的和持续集成工具 jenkins 集成
可支持执行部分用例
具有很多第三方插件,并且可以自定义扩展
Pytest安装
在Python的虚拟环境pip中直接输入
pip install pytest
创建一个简单的Demo, 文件名字为: test_demp.py
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
class TestClass:
def test_a(self):
print('1')
def test_b(self):
print('2')
注意:
- 执行 pytest 时候 会查找当前目录及其子目录下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以 test 开头函数并执行
- 执行一个文件的时候就 pytest + 指定文件.py
- Test类包含的所有test_的方法(测试类不能有__init__.py)
或者可以选择用Python的解释器执行, 在test_demo.py文件底下加上入口
if __name__ == '__main__':
pytest.main(['test_demo.py'])
Pytest执行用例规则
1、运行test_demo.py 模块里面的某个函数,或者某个类,某个类里面的方法
加v和不加-v都可以,加-v的话,打印的信息更详细
pytest -v test_demo.py::TestClass::test_one
pytest test_demo.py::TestClass::test_one
pytest test_demo.py::test_answer
2、执行某个 匹配用例名称 -k
pytest -k test_a -v
3、-k 同时匹配不同的用例名称, 符合 test_a* 或者 test_b* 的函数都会进行测试
pytest -k "test_a or test_b" -v
4、 (常用)参数化的方式生成多个测试用例, 在test_demo.py中更改代码 改为
@pytest.mark.parametrize('a,b', [(1, 2), (2, 3)])
def test_answer(a, b):
assert func(a) == b
然后在控制台中执行: pytest -k test_answer -v
5、遇到需要在测试用例前进行的操作,比如登录,则需要在函数前加入装饰器fixture
# 同样改写的是test_demo.py, 在最外层写个函数
@pytest.fixture()
def login():
print('登录之后')
username = 'od'
return username
然后在 TestClass 中调用
class TestClass:
def test_a(self, login):
print(f'login name is {login}')
print('1')
def test_b(self):
print('2')
def test_c(self, login):
print(f'login name is {login}')
print('3')
#然后执行
pytest -v -s
#-s 可以在控制台输出print的内容
这样就可以执行装饰器修饰的所有测试, 下一节学的是参数驱动的一些笔记