python unittest框架

1. unittest框架

在自动化测试中使用, 管理执行测试用例

框架:

1)framework

2)为了解决一类事情的功能集合

是python自带的单元测试框架,无需安装

使用的原因:

  • 1)能够组织多个用例去执行
  • 2)提供丰富的断言方法
  • 3)能够生成测试报告

核心要素

  1. TestCase 测试用例
  2. Testsuite 测试套件,作用是用来组装打包TestCase的
  3. TestRunner 测试执行,作用是用例执行TestSuite的
  4. TestLoader 测试加载,是对testsuite的功能补充
  5. Fixture 测试夹具,是一种代码结构, 书写前置方法(执行用例之前的方法)和后置方法(执行用例之后的方法),即用例执行顺序,前置--->用例-->后置

步骤:

  1. 导包
  2. 定义测试类,需要继承unittest.TestCase类,习惯性类名以Test开头
  3. 书写测试方法,必须以test开头
  4. 执行
import unittest

# 定义测试类, 只要继承unittest.TestCase类,就是测试类
class TestDemo(unittest.TestCase):
    # 书写测试方法,方法中的代码就是真正用户代码, 方法名必须以test开头
    def test_method1(self):
        print("测试方法一")
    def test_method2(self):
        print("测试方法二")

# 执行:
# 1.在类名右键执行,执行类中的所有测试方法
# 2.在方法名右侧执行,只执行当前的测试方法
if __name__ == '__main__':
    unittest.main()

2. TestRunner(测试执行)

用来执行测试套件

  1. 导包 unittest
  2. 实例化 执行对象 unittest.TextTestRunner()
  3. 执行对象执行 套件对象 执行对象.run(套件对象)

3. 整体步骤

  1. 导包 unittest
  2. 实例化套件对象 unittest.TestSuite()
  3. 添加用例方法 套件对象.addTest(测试类名('测试方法名'))
  4. 实例化 执行对象 unittest.TextTestRunner()
  5. 执行对象执行 套件对象 执行对象.run(套件对象)
# 1.导包
import unittest
from hm_02_testcase1 import TestDemo1
from hm_02_testcase2 import TestDemo2

# 2.实例化套件对象
suite = unittest.TestSuite()

# 3.添加用例方法
# suite.addTest(TestDemo1('test_method1'))
# suite.addTest(TestDemo2('test_method2'))
suite.addTest(unittest.makeSuite(TestDemo1))

# 4.实例化执行对象
runner = unittest.TextTestRunner()

# 5.执行对象执行套件对象
runner.run(suite)

4. TestLoader测试加载

将2和3 合成一步

# 1. 导包
import unittest
# 2. 实例化加载对象并加载用例,得到套件对象
suite = unittest.TestLoader().discover('.','hm_02*.py')
# 3. 实例化执行对象
runner = unittest.TextTestRunner()
# 4. 执行
runner.run(suite)

5. Fixture

1)方法级别的fixture

每个用例执行前后都会自动调用,方法名是固定的

def setUp(self): # 方法前置

        pass

def tearDown(self): # 方法后置

        pass

2)类级别的fixture

在类中所有的测试方法执行前后,会自动执行的代码,只执行一次

@classmethod

def setUpClass(cls):

        pass

def tearDownClass(cls):

        pass

在用例脚本中,使用断言(使用代码自动判断预期结果和实际结果是否相等)

参数化(将测试数据定义到json文件)

跳过(某些用例由于某种原因不想执行,设置为跳过)

6. 断言

asserEqual(预期结果,实际结果)

判断预期结果和实际结果是否相等, 如果相等, 用例通过,如果不相等,抛出异常,用例不通过

assertIn(预期结果,实际结果)

判断预期结果是否包含在实际结果中, 如果存在,用例通过,如果不存在,抛出异常,用例不通过

import unittest

class TestAssert(unittest.TestCase):
    def test_equal_1(self):
        self.assertEqual(10,10)

    def test_in(self):
        self.assertIn("admin","1admin")
import unittest

from test_demo4 import TestAssert

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAssert))
unittest.TextTestRunner().run(suite)

7. 参数化:

通过参数的方式来传递数据,从而实现数据和脚本分离。 并且可以实现用例的重复执行。

unittest 测试框架,本身不支持参数化,但是可以通过安装unittest 扩展插件parameterized来实现。

使用:

1.导包,from parameterized import parameterized

2. 修改测试方法,将测试方法中的测试数据使用变量表示

3. 组织测试数据, 格式[(),(),()],一个元组就是一组测试数据

4. 参数化,在测试方法上方使用装饰器@parameterized.expand(测试数据)

5. 运行(直接 TestCase 或者使用suite运行)

from tools import add
import unittest
from parameterized import parameterized

data = [(1,1,8),(1,2,3),(2,3,5),(4,5,9)]

class TestAdd(unittest.TestCase):
    @parameterized.expand(data)
    def test_add(self,a,b,expect):
        print(f'a:{a},b:{b},expect:{expect}')
        self.assertEqual(expect,add(a,b))

if __name__ == '__main__':
    unittest.main()

tools.py

def add(a,b):
    return a+b

练习

将测试数据定义为 json文件,读取json文件,完成参数化

1)json文件

[
  [1,2,3],
  [2,3,5],
  [4,5,9],
  [3,7,15]
]

2. 读取json的方法

read_json.py

import json

def build_add_data():
    with open("test.json") as f:
        data = json.load(f) #转换为python对象
    return data

3. tools.py

def add(a,b):
    return a+b

4. test_add.py

from parameterized import parameterized
from read_json import build_add_data
import unittest
from tools import add

class TestAdd(unittest.TestCase):
    @parameterized.expand(build_add_data())
    def test_add(self,a,b,c):
        self.assertEqual(c,add(a,b))

if __name__ == '__main__':
    unittest.main()

如果json文件是这种格式,比如:

[
  {
    "a": 1,
    "b": 2,
    "expect": 3
  },
    {
    "a": 2,
    "b": 2,
    "expect": 3
  },  
  {
    "a": 1,
    "b": 2,
    "expect": 5
  }
]

可以用下面的方法来实现

def build_add_data1():
    with open("test1.json") as f:
        data_list = json.load(f) #转换成Python对象
        print(data_list)

        new_list = []
        for data in data_list: # data是字典
           new_list.append(tuple(data.values()))

        return new_list

8. 测试报告

使用第三方的报告模板,生成 报告,HTMLTestReport,本质是TestRunner

  1. 导包unittest\HTMLTestReport
  2. 组装用例(套件,loader)
  3. 使用HTMLTestReport 中的runner 执行套件
  4. 查看报告
import unittest
from htmltestreport import HTMLTestReport
from sample.test_add import TestAdd

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestAdd))

runner = HTMLTestReport("test.html",'加法测试报告','菲菲测试')
runner.run(suite)

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值