1、常见的单元测试框架:
pytest、unittest、nose(python版单元测试框架) unittest是python官方自带标准包
junit、TestNg(java版单元测试框架)
2、unittest单元测试框架可用于web自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。
1)一个.py文件是一个测试功能点,里面包含多个测试点。一个类里有多个方法
2)区分测试用例,冒烟的放一起,回归的放一起
1、写装饰器函数,
缺点:每个case前都需要加个装饰器,且case重新执行不能执行setUp()和tearDown()
2、修改unittest框架代码,
在记录执行结果的部分,如果case执行失败,则继续执行;加计数器,记录执行多少次后不再执行;只记录case最后一次执行的结果。
import unittest
# 定义测试类继承TestCase
class BaiDuTest(unittest.TestCase):
#所有test运行前运行一次
@classmethod
def setUpClass(cls):
pass
# 定义每个测试用例执行前的初始化方法
def setUp(self):
pass
# 定义测试用例,用例必须以test开头
def test_case001(self):
pass
# 可定义多个测试用例
def test_case002(self):
self.assertEqual(1==1)
@unittest.skip('跳过执行')
def test_case003(self):
self.assertEqual(1==1)
# 定义每个测试用例执行完后的方法
def tearDown(self):
pass
# 所有test运行后运行一次
@classmethod
def tearDownClass(cls):
pass
if __name__ == '__main__':
# 执行测试用例
unittest.main()
import unittest
'''
1、unittest.TestCase 是所有测试用例类继承的基类
'''
class BaiDuTest(unittest.TestCase):
'''
2、@unittest.expectedFailure(): expectedFailure(),如果test失败了,这个test不计入失败的case数目
'''
def test_case001(self):
pass
'''
3、@unittest.skip("reason") 无条件跳过装饰的测试,并说明跳过测试的原因
4、@unittest.skipIf('condition','reason') 条件为真时,跳过装饰的测试,并说明跳过测试的原因。
5、@unittest.skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
'''
def test_case002(self):
pass
'''
6、unittest.TestSuite 创建测试套件对象,
'''
suite = unittest.TestSuite()
# 添加到TestSuite中的case是会按照添加的顺序执行
suite.addTest(BaiDuTest('test_case001'))
suite.addTest(BaiDuTest('test_case002'))
'''
7、unittest.TextTestRunner 生成TextTestRunner 对象,该对象的run方法可用来执行suite中的测试用例
'''
unittest.TextTestRunner.run(suite)
'''
8、unittest.main 将一个单元测试模块变为可直接执行的测试脚本。
先使用TestLoader类来搜索所有包含在该模块中以"test"开头的测试方法,并封装在套件中,再使用TextTestRunner.run执行测试套件
'''
unittest.main()
'''
9、defaultTestLoader 类下面的discover()方法可自动根据测试目录start_dir匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,可以直接通过run()方法执行测试用例。
'''
unittest.defaultTestLoader.discover('test_dir', pattern='test_*.py').run()
class BaiDuTest(unittest.TestCase):
'''
1、setUp()方法用于测试用例执行前的初始化工作。
如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。
如测试用例需要登录web,可以先实例化浏览器。
构造初始化数据
'''
def setUp(self):
pass
'''
2、tearDown()方法用于测试用例执行之后的善后工作。
如关闭数据库连接。
关闭浏览器。
清除数据库表数据
'''
def tearDown(self):
'''
3、assert()断言
'''
self.assertEqual(1==1)
suite = unittest.TestSuite()
# 添加到TestSuite中的case是会按照添加的顺序执行
suite.addTest(BaiDuTest('test_case001'))
'''
unittest.TextTestRunner生成TextTestRunner 对象,
该对象的run方法可用来执行suite中的测试用例
'''
unittest.TextTestRunner.run(suite)
unittest.TextTestResult
执行方法1:
'''
unittest.TestSuite创建测试套件对象,
该对象下的addTest方法可将测试用例加入套件中
'''
suite = unittest.TestSuite()
# 添加到TestSuite中的case是会按照添加的顺序执行
suite.addTest(BaiDuTest('test_case001'))
suite.addTest(BaiDuTest('test_case002'))
'''
unittest.TextTestRunner生成TextTestRunner 对象,
该对象的run方法可用来执行suite中的测试用例
'''
unittest.TextTestRunner.run(suite)
执行方法2:
'''
unittest.main将一个单元测试模块变为可直接执行的测试脚本。
先使用TestLoader类来搜索所有包含在该模块中以"test"开头的测试方法,并封装在套件中
再使用TextTestRunner.run执行测试套件
'''
unittest.main()
执行方法3:
'''
使用defaultTestLoader类下面的discover()方法可自动根据测试目录start_dir匹配查找测试用例文件(test*.py),
并将查找到的测试用例组装到测试套件,
可以直接通过run()方法执行测试用例。
'''
unittest.defaultTestLoader.discover('test_dir', pattern='test_*.py').run()
1.在第一行给出了每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E,跳过是 S。用例的顺序和执行顺序没有关系
2.在unittest.main()中加 verbosity 参数可以控制输出的错误报告的详细程度,默认是 1,如果设为 0,则不输出每一用例的执行结果,即没有上面的结果中的第1行;如果设为 2,则输出详细的执行结果.
.F..
======================================================================
FAIL: test_divide (__main__.TestMathFunc)
Test method divide(a, b)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:/py/test_mathfunc.py", line 26, in test_divide
self.assertEqual(2.5, divide(5, 2))
AssertionError: 2.5 != 2
----------------------------------------------------------------------
Ran 4 tests in 0.000s
FAILED (failures=1)
1、通过HTMLTestRunner将结果输出到HTML中,生成测试报告。
2、中文版:HTMLTestRunnerCN
3、使用方法:
(1)下载HTMLTestRunner.py文件 放在python安装文件下,或者自己的项目下
(2)
import HTMLTestRunner
suite = unittest.TestSuite()
# 添加到TestSuite中的case是会按照添加的顺序执行
suite.addTest(BaiDuTest('test_case001'))
with open('' 'wb') as f:
HTMLTestRunner.HTMLTestRunner(stream=f, title='测试报告', description='测试结果').run(suite)
4、HtmlTestRunner_cn支持截图功能
1、安装第三方包ddt : pip install ddt
2、
import unittest
from ddt import ddt,data,file_data,unpack
@ddt
class A(unittest.TestCase):
'''
test_a()被执行三次,
test_a(3)
test_a(4)
test_a(5)
'''
@data(3, 4, 5)
def test_a(a):
print(a)
'''
[3,8]被当作整体传给a
'''
@data([3, 8], [4, 5])
def test_b(a):
print(a)
'''
[3, 4]被拆成两个参数分别传给a和b
'''
@data([3, 4], [2, 1])
@unpack
def test_a(a, b):
print(a + b)
'''
从文件中传参
'''
@ddt.file_data(r'xxx\login.yml')
def test_b(key1,key2):
pass