柠檬班unitest和数据驱动

Python单元测试与数据驱动测试实战
本文介绍了如何使用Python的unittest模块进行单元测试,包括测试用例的编写、测试套件的创建和运行。同时,展示了ddt库在数据驱动测试中的应用,通过读取Excel数据进行多条测试用例的生成。此外,还涉及到了日志记录和配置文件的操作,以及JSON数据的读写。

在这里插入图片描述

import unittest
def login(user,password):
    if user == 'mumu' and password == 123456:
        return '成功'
    else:
        return '失败'

"""
unitest测试用例编写规范
1、定义一个测试用例类,必须继承unitest模块中的TestCase
2、测试用例类中,一个test开头的方法就是一条测试用例
3、将测试用例执行的逻辑写到对应的测试方法中
#1:准备用例数据
#2:调用被测的功能函数(发送接口调用数据)获取实际结果
# 3 断言
fixture:测试夹具  用例级别和类级别
"""

class TestLogin(unittest.TestCase):
    # 用例前置脚本
    def setUp(self):
        print(11)
    # 用例后置脚本
    def tearDown(self):
        print('teardown')

    def test_login_pass(self):
        params = {
            'user': 'mumu',
            'password': 123456
        }
        res = login(**params)
        assert '成功' == res

    def test_login_error(self):
        params = {
            'user': 'mumu1',
            'password': 123456
        }
        res = login(**params)
        assert '失败' == res

创建run.py文件运行用例

"""
1 创建测试套件,加载测试用例到套件
2 创建一个测试用例运行程序
3 运行测试用例
"""
import unittest
# 创建套件
# suite = unittest.TestSuite()
# # 创建一个用例加载器
# load =unittest.TestLoader()
# # 加载测试用例到套件
# suite.addTest(load.discover(r'E:\testzidonghua\student\data'))
# 上面三行简写一行
su = unittest.defaultTestLoader.discover(r'E:\testzidonghua\student\data')
# 第二步:创建一个测试用例运行程序
runner = unittest.TextTestRunner()
# 第三不:运行测试用例
runner.run(su)

ddt

"""
unitest执行顺序:同一个类根据ascll码排序,同一个文件有多个类的ascll码排序
ddt使用步骤:
1 测试类前面使用@ddt
2 在测试方法前使用@list_ddt
"""
import unittest
from unittestreport import ddt,list_data
import openpyxl
from funkexun import login

workbook = openpyxl.load_workbook('yi.xlsx')
sh = workbook['Sheet1']
res = list(sh.rows)
title = [i.value for i in res[0]]
# 获取第二行以后的字典形式的数据
cases = []
for item in res[1:]:
    r2 = [i.value for i in item]
    r3 = dict(zip(title,r2))
    cases.append(r3)
print(cases)

@ddt
class TestLogin(unittest.TestCase):

    @list_data(cases)
    def test01(self, item):
        print(item)
        expeted = '成功'
        params = item
        res = login(**params)
        print(res)
        self.assertEqual(expeted,res)

excel

"""
excel
"""
import openpyxl

# 加载excel文件为工作簿对象
workbook = openpyxl.load_workbook('yongli1.xlsx')
# 获取所有的表单名字
print(workbook.sheetnames)
# 选中表单
sh =workbook['Sheet1']
# 读取数据
c = sh.cell(row=2 ,column=2)
print(c.value)
#  --------------------获取所有的数据----------
# rows:按行所有的数据
res = list(sh.rows)
# 获取第一行的数据
title = [i.value for i in res[0]]
print(title)
# 获取第二行以后的字典形式的数据
cases = []
for item in res[1:]:
    r2 = [i.value for i in item]
    r3 = dict(zip(title,r2))
    cases.append(r3)
print(cases)

logiing日志
在这里插入图片描述
控制台输出日志

"""
logging.getLogger('senlin')创建日志收集器
       创建日志收集器不传name参数,返回的是默认的收集器(root)
       传name会创建一个新的日志收集器
"""
import logging

log = logging.getLogger('senlin')
# 设置日志收集器收集日志的等级
log.setLevel('DEBUG')
# 设置输出日志的等级
# 1 设置日志输出的渠道(控制台)
sh = logging.StreamHandler()
sh.setLevel('DEBUG')
# 2 将输出渠道绑定到日志收集器上
log.addHandler(sh)


log.debug('__debug__')
log.info('__info__')
log.warning('__warning__')
log.error('__error__')
log.critical('__critical__')

在这里插入图片描述
在这里插入图片描述
操作配置文件

from configparser import ConfigParser

# 第一步:创建配置文件解析器对象
cp = ConfigParser()

# 第二步:读取配置文件中的内容到配置文件解析器中
cp.read('musen.ini')

# 第三步:读取配置内容
# 方法一:get:使用get方法读取的配置内容都会当成字符串
res = cp.get('logging', 'file')
print(res)
# 方法一:getint:使用get方法读取的配置内容都会当成字符串
res2 = cp.getint('mysql','port')
print(res2)

json

"""
json数据和python数据的差异点:
python中的数据为空:None   json:null

"""
import json
with open('data.json', 'r', encoding='utf-8') as f:
    res = json.load(f)

print(res, type(res))

dic = {'a': None,'b': 'python','c':False}
# 将python数据转为json
resd = json.dumps(dic)
print(resd)
# 将json转为python
respyth = json.loads(resd)
print(respyth)

在这里插入图片描述

### 单元测试框架比较:unittest vs pytest Python 提供了多个单元测试框架,其中最常用的两个是 `unittest` `pytest`。它们各有特点,适用于不同的测试需求。 #### unittest `unittest` 是 Python 标准库的一部分,因此无需额外安装即可使用。它基于 xUnit 风格,适合用于简单的测试场景,特别是对于熟悉 Java 的 JUnit 框架的开发者来说,`unittest` 提供了类似的结构功能。 - **测试用例结构**:在 `unittest` 中,测试用例通常继承自 `unittest.TestCase` 类,并通过定义以 `test_` 开头的方法来编写测试用例。 - **断言**:`unittest` 提供了丰富的断言方法,如 `assertEqual()`, `assertTrue()`, `assertRaises()` 等,用于验证测试结果。 - **测试发现**:`unittest` 支持自动发现测试用例,可以通过命令行运行测试,例如 `python -m unittest a.py`[^1]。 - **测试执行**:`unittest` 的测试执行器可以生成详细的测试报告,包括测试通过与否的信息。 #### pytest `pytest` 是一个第三方测试框架,相比 `unittest` 更加简洁灵活,支持原生的 `assert` 语句,拥有强大的 fixture 系统丰富的插件生态,适合复杂的测试需求。 - **测试用例结构**:在 `pytest` 中,测试用例不需要继承特定的类,只需要编写以 `test_` 开头的函数即可。测试文件可以放在单独的目录中,文件名可以是 `test_*.py` 或 `*_test.py`[^3]。 - **断言**:`pytest` 支持直接使用 Python 的 `assert` 语句进行断言,这使得测试代码更加简洁易读。 - **异常处理**:`pytest` 提供了 `pytest.raises()` 上下文管理器来断言特定的异常,例如 `with pytest.raises(IndexError):`[^4]。 - **测试执行**:`pytest` 的测试执行器支持多种选项,如 `-q` 用于静默模式,`-v` 用于详细输出等。测试结果会显示每个测试用例的状态,如通过、失败或跳过。 #### 比较总结 - **易用性**:`pytest` 更加简洁灵活,支持原生 `assert` 语句,而 `unittest` 需要使用特定的断言方法。 - **扩展性**:`pytest` 拥有丰富的插件生态,支持多种第三方插件,而 `unittest` 的扩展性相对较弱。 - **测试组织**:`unittest` 要求测试用例继承自 `TestCase` 类,而 `pytest` 不需要,测试用例可以是普通的函数。 - **测试执行**:`pytest` 的测试执行器提供了更多的选项更详细的输出,而 `unittest` 的测试执行器相对简单。 #### 示例代码 以下是一个简单的 `unittest` 测试用例示例: ```python import unittest class TestStringMethods(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper(), 'FOO') def test_isupper(self): self.assertTrue('FOO'.isupper()) self.assertFalse('Foo'.isupper()) def test_split(self): s = 'hello world' self.assertEqual(s.split(), ['hello', 'world']) # check that s.split fails when the separator is not a string with self.assertRaises(TypeError): s.split(2) if __name__ == '__main__': unittest.main() ``` 以下是一个简单的 `pytest` 测试用例示例: ```python def test_upper(): assert 'foo'.upper() == 'FOO' def test_isupper(): assert 'FOO'.isupper() assert not 'Foo'.isupper() def test_split(): s = 'hello world' assert s.split() == ['hello', 'world'] # check that s.split fails when the separator is not a string with pytest.raises(TypeError): s.split(2) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值