unittest框架

测试框架

1、常见的单元测试框架:
pytest、unittest、nose(python版单元测试框架) unittest是python官方自带标准包
junit、TestNg(java版单元测试框架)
2、unittest单元测试框架可用于web自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

组织测试用例

1)一个.py文件是一个测试功能点,里面包含多个测试点。一个类里有多个方法
2)区分测试用例,冒烟的放一起,回归的放一起

执行失败case重试

1、写装饰器函数,
缺点:每个case前都需要加个装饰器,且case重新执行不能执行setUp()和tearDown()
2、修改unittest框架代码,
在记录执行结果的部分,如果case执行失败,则继续执行;加计数器,记录执行多少次后不再执行;只记录case最后一次执行的结果。

unittest框架编写测试用例思路

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()

unittest模块属性

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()

TestCase类属性

class BaiDuTest(unittest.TestCase):
    '''
    1、setUp()方法用于测试用例执行前的初始化工作。
    如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。
    如测试用例需要登录web,可以先实例化浏览器。
    构造初始化数据
    '''
    def setUp(self):
        pass

    '''
    2、tearDown()方法用于测试用例执行之后的善后工作。
    如关闭数据库连接。
    关闭浏览器。
    清除数据库表数据
    '''
    def tearDown(self):
        '''
        3、assert()断言
        '''
        self.assertEqual(1==1)

TestSuite类的属性

suite = unittest.TestSuite()
# 添加到TestSuite中的case是会按照添加的顺序执行
suite.addTest(BaiDuTest('test_case001'))

TextTextRunner的属性

'''
unittest.TextTestRunner生成TextTestRunner 对象,
该对象的run方法可用来执行suite中的测试用例
'''
unittest.TextTestRunner.run(suite)

保存case执行结果

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

Mock 辅助单元测试的模块

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值