unittest单元测试基础入门

pytest

前提安装: pip install pytest

1.测试文件必须以test_开头或者test结尾(非耦合)

2.测试类名必须Test开头

3.测试用例必须以test_开头

夹具的差异

setup/teardown 在每个用例的前后执行

setup_class/teardown_class 在每个类的前后执行

setup_module/teardown_module 在每个模块的前后执行

断言的差异

python原生的assert

失败用例重跑差异

支持

参数化差异

@pytest.mark.parametrize()

unittest

一 、基本用法

1.新建一个类,必须继承unittest.TestCase(耦合)

2.导入unittest模块

3.测试用例必须以test_开头

二、夹具的差异

setUp/tearDown 在每个用例的前后执行

setUpClass/tearDownClass 在每个类的前后执行

setUpModule/tearDownModule 在每个模块的前后执行

三、断言的差异

self.assertEqual()

四、失败用例重跑差异

不支持

五、参数化差异

ddt

六、重要组件

TestCase 测试用例

TestSuite 测试套件:整理测试用例,形成一个集合

TestFixtrue 测试固件

TestLoader 测试加载器:加载测试用例套件或者测试用例

TestRunner 测试运行器:运行测试用例

为什么我们使用unittest.main()就可以执行所有的测试用例?

  • 测试加载器已经初始化

  • 通过测试加载器加载测试用例保存到self.test

  • 创建文本测试运行器

    最后通过 self.result=testRunner.run(self.test) 执行已经加载好的测试用例。并且吧结果放到self.result

module:测试用例所在的路径,__main__代表当前模块

defaultTest:默认的待测试的测试用例或者测试套件的名称

argv:接收外部传递给程序的参数

testRunner:测试运行器

testLoader:测试加载器

exit:是否在测试用例结束之后退出程序

verbosity:显示详细信息的程度

<0 只显示用例总数以及全局执行结果

1 默认值,显示用例总数以及全局执行结果外,还显示一个标记:. F E S

>=2 显示用例总数以及全局执行结果,详细结果

七、如何运行测试用例

运行方式有两种

1.命令行的运行方式。(unittest默认执行方式)

python -m unittest **.py

python -m unittest 模块名.类名

python -m unittest 模块名.类名.用例名

python -m unittest -v **.py

python -m unittest -v **.py -k *_baill

python -m 以命令行的方式运行测试用例

unittest -v 以详细的方式展示测试结果

-k 表示通过通配符匹配的方式去查找测试用例

2.main方式运行

if __name__=='__main__':

        unittest.main()

八、运行结果

、代表成功,如果加了-v,那么会变成OK

F代表用户失败

E:出错,有异常抛出

S:代表用例被跳过

九、测试用例的执行顺序

ord() python的内置函数,返回ASCII码

根据ASCII的大小排序来执行测试用例

十、多种unittest的加载方式和运行测试用例的方式

1.通过TestSuite加载多个测试用例的方式执行

import unittest
​
from test_api import TestApi
​
from test_web import TestWeb
​
if __name__ == '__main__':
​
  #创建一个测试套件
​
  suite=unittest.TestSuite()
​
  #把测试用例加载到测试套件里边
​
  testcases=[TestApi('test_mashang'),TestApi('test_01'),TestWeb('test_01')]
​
  suite.addTest(testcases)
​
  # suite.addTest(TestApi('test_mashang'))
​
  # suite.addTest(TestApi('test_01'))
​
  # suite.addTest(TestWeb('test_01'))
​
  #执行时一定要指定套件
​
  unittest.main(defaultTest='suite')

2.加载一个目录下所有测试用例

import unittest
​
if __name__=='__main__':
​
  suite=unittest.defaultTestLoader.discover("./wen",pattern="test_*.py")`
​
  unittest.main(defaultTest='suite')

十一、unittest夹具

setUp/tearDown 在每个用例的前后执行

setUpClass/tearDownClass 在每个类的前后执行

setUpModule/tearDownModule 在每个模块的前后执行

import unittest
class TestWeb(unittest.TestCase):
    def setUp(self) -> None:
        print("在每一个测试用例之前执行,打开浏览器,加载网页")
​
    def tearDown(self) -> None:
        print("在每个测试用例之后执行,关闭浏览器")
​
    @classmethod
    def setUpClass(cls) -> None:
        print("在每个类之前执行,初始化日志对象,创建数据库连接")
    @classmethod
    def tearDownClass(cls) -> None:
        print("在每个类之后执行,销毁日志对象,销毁数据库连接")
if __name__=='__main__':
    unittest.main()

requests

注意:

get请求通过params传递参数

post请求通过json或者data传参。他们的区别是什么?文件上传是通过files上传

data

数据报文:dict字典类型,那么默认情况下请求头:application/x-www-form-urlencoded,表示以form表单的方式传参,格式a=1&b=2&c=3

数据报文:str类型,那么默认情况下:text/plain

json

数据报文:不管是dict还是str类型,默认都是application/json,格式:{a:1,b:2}

json.dumps(data) 序列化 把字典格式转成字符串

json.loads(data) 反序列化 把str格式转换成字典格式

总结:

data只能传简单的只有键值对的dict或者str格式。json一般只能传dict格式(简单和嵌套都可以)

你可能感兴趣的:(单元测试,python)