unittest
一、什么是框架?
框架其实是开发大佬定制研发的应用骨架,是一个半成品,它对基础的代码进行了封装并提供一些API 接口。他开发者只需要直接调用封好的额 API 接口即可可以去很多代码编写,从而提高工作效率。
二、什么是自动化框架以及它的作用
(1)自动化框架
自动化测试 leader为了对一个系统做目动化测试而封装的一个代码主骨架,其它的自动化測试工程师只需要去调用这个骨架里面的方法就可以实施自动化测试,这个代码骨架就叫自动化框架。
(2)自动化框架的作用
- 提高测试效率,降低成本
- 减少人工干预脚本因素
- 增加代码的可重用率
单元测试:指的是针对我们程序的最小单元进行测试。
unittest:自动化框架的重要的组成部分之一。
三、单元测试框架对比
基于python语言:unitteset和pytest
基于java语言:junit和testng
-
用例编写规则
unitest:提供了testcases测试用例、testsuites测试套件、testfixtures测试夹具、testloader测试加载器、testrunner测试运行器。必须遵守以下规则:
(1)测试文件必须导入import unittest
(2)测试类必须继承unittest、TestCase
(3)测试方法必须以test开头
pytest:它是python的第三方测试框架,基于unittest的扩展框架,必须遵守以下规则:
(1)测试文件名必须以test_开头或者是 _test结尾
(2)测试类命令必须以Test开头
(3)测试方法必须test开头
-
用例的前置和后置
unittest:
setUp/tearDown 在每个用例之前、之后运行一次
setUpClass/tearDownClass 在每个类之前、之后运行一次
setUpModule/tearDownModule 在每个模块之前、之后运行一次
pytest
方法级:
setup_mothod/teardown_mothod
setup/teardown
函数级:
setup_function/teardown_mothod
类级:
setup_class/teardown_class
模块级:
setup_module/teardown_module
此外:还可以在函数之前加@pytest.fixture()装饰器
-
断言
unittest : assertTrue,assertEqual,assertIn
pytest : assert
-
报告
unittest :htmltestrunner
pytest : pytest-HTML, allure插件
-
失败重跑
unittest : 没有
pytest : pytest-rerunfailures插件
-
数据驱动
unittest : ddt
pytest : @pytest.mark.parametrize装饰器
-
用例分类执行
unittest : 默认执行所有,也可以通过testsuite来执行部分用例,或者-k参数
pytest : @pytest.mark来标记
四、unittest框架做了什么?
-
测试发现:从多个py文件中收集并且加载测试用例
-
测试执行:将测试用例按照一定的顺序和条件去执行并且生成结果
-
测试判断:通过断言去判断结果是否正确
-
测试报告:统计测试进度,通过率,生成报告
五、unittest重要组件
- TestCase
- TestSuite
- TestFixture
- TestLoader
- TestRunner
六、TestCase用法
命令行的方式运行:
更适合集成Jenkins的时候运行,所有的命令行都表示非GUI方式∂
光标在哪儿的时候右键运行,点哪儿运行哪儿,可以运行单个用例,与命令行运行相同
python -m unittest kinghonour_login.KingHonourLogin
-m : 以脚本的形式运行一个模块
-v :–verbose意思详细地输出结果
kinghonour_login.KingHonourLogin:模块名.类名,想只执行一个用例再.用例名即可
-k :通配符 -k *_name / 字符串 -k name
问题:后运行成功,但是在其他文件下通过相对路径或者绝对路径方式执行都会显示找不到这个模块
**注意:**之前用pytest测试后,运行unittest还是显示launching pytest,百度之后未找到明确方案改成unittest,瞎摸索之后成功改成,方式如下:
-
把pycharm设置偏好->工具->python集成工具->测试中的pytest改为unittest
-
点击右上角运行左边的下三角中的编辑配置,把python调试中有pytest的选项删除
-
在unittest文件中增加以下代码再运行main函数,右键运行,成功
if __name__ == '__main__': unittest.main()
使用main函数的方式运行:
点击编辑配置文件,在python下新建一个python,找到这个模块确认
点击运行,右键是以命令行的方式运行
七、执行结果的含义
. :成功
F:失败
E:错误
S:跳过
八、用例的执行顺序
按照ASCII码的规则
【0-9 A-Z a-z】
内置函数ord(‘a’)查看ASACII码值
九、框架的底册原理
跳转到main函数的实现,main = TestProgram,说明main函数为TestProgram类,unittest.main()自动运行了__init__方法,查看init的源代码
module='__main__', #测试用例所在的路径__main__表示当前模块
defaultTest=None, #待测用例的名称,可以添加列表
argv=None, #表示接受的外部参数
testRunner=None, #测试运行器,默认的text
testLoader=loader.defaultTestLoader, #指定使用默认的测试用例加载器
exit=True, #是否在测试完成之后结束python程序
verbosity=1, #类似命令行-v 可以等于0,1,2 2为详细方式
failfast=None, #失败的时候是否终止测试
catchbreak=None, #是否捕获复制
buffer=None, #是否捕获输出流
warnings=None,*, #是否补货失败信息
tb_locals=False #
例子:
- 一个一个导入
import unittest
class KingHonourLogin(unittest.TestCase):
# 测试用例
def test01_libai(self):
print('测试李白')
def test02_hanxin(self):
print('测试韩信')
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(KingHonourLogin('test01_libai'))
suite.addTest(KingHonourLogin('test02_hanxin'))
unittest.main(defaultTest='suite')
- 整体导入
import os
import unittest
class KingHonourLogin(unittest.TestCase):
# 测试用例
def test01_libai(self):
print('测试李白')
def test02_hanxin(self):
print('测试韩信')
if __name__ == '__main__':
suite = unittest.TestSuite()
testcases = unittest.defaultTestLoader.discover(start_dir=os.getcwd(),pattern='*.py')
# testcases = [KingHonourLogin('test01_libai'), KingHonourLogin('test02_hanxin')]
suite.addTests(testcases)
# unittest.main(defaultTest='suite')
unittest.TextTestRunner().run(suite)