引言
python小程序之参数化以及Assert(断言)
文章目录
- 引言
- 一、参数化
- 2.1 题目
- 2.2 代码
- 2.3 代码解释
- 二、Assert(断言)
- 2.1 概念
- 2.1.1 Assert语句的基本语法:
- 2.1.2 基本断言
- 2.1.3 断言函数参数
- 2.1.4 断言前后状态一致
- 2.2 题目
- 2.3 代码
- 2.3.1 tool模块代码
- 2.3.2 断言代码
- 2.4 代码解释
- 三、思考
- 3.1 参数化
- 3.2 Assert(断言)
一、参数化
2.1 题目
如何参数化
2.2 代码
import unittest
from parameterized import parameterized
from tools import login
data = [
('admin', '123456', '登录成功'),
('root', '123456', '登录失败'),
('admin', '123123', '登录失败')
]
class TestLogin2(unittest.TestCase):
def test_login(self, username, passwprd, expect):
self.assertEqual(expect,login(username, passwprd))
输出结果:
2.3 代码解释
这段python代码使用
unittest
框架和parameterized
扩展来编写参数化的单元测试用例,用于测试login
函数
import unittest
这行代码导入了Python标准库中的unittest
模块,它是一个用于编写和运行测试的框架
from parameterized import parameterized
这行代码从parameterized
模块中导入了parameterized
装饰器,它允许我们为测试用例提供多个参数集,从而可以重复运行同一个测试方法,每次使用不同的参数
from tools import login
这行代码从名为tools
的模块中导入了一个名为login
的函数,这个函数是测试的目标
data = [
('admin', '123456', '登录成功'),
('root', '123456', '登录失败'),
('admin', '123123', '登录失败')
]
这里定义了一个名为data
的列表,其中包含了多个元组。每个元组代表一组测试数据,包含用户名、密码和期望的登录结果
class TestLogin2(unittest.TestCase):
这行代码定义了一个名为TestLogin2
的类,用于包含登录功能的测试用例,它继承自unittest.TestCase
def test_login(self, username, password, expect):
self.assertEqual(expect, login(username, password))
这是一个测试方法,名为test_login
,它使用parameterized
装饰器来接受不同的参数集。该方法测试login
函数,传入用户名和密码,并使用assertEqual
断言来检查login
函数的返回值是否与期望的结果expect
相等
为了使test_login
方法能够接受参数,需要使用parameterized.expand
来装饰该方法,并提供参数列表
二、Assert(断言)
2.1 概念
在python中,断言(Assertion)是通过内置的
assert
语句实现的。assert
语句用于检查一个条件是否为真,如果条件不为真,则会引发一个AssertionError
异常。这通常用于开发和测试阶段,以验证代码中的假设和不变量
2.1.1 Assert语句的基本语法:
assert condition, [error_message]
condition
:一个表达式,如果该表达式为False
,则会引发异常。error_message
(可选):当condition
为False
时,assert
语句引发的AssertionError
异常的详细信息
2.1.2 基本断言
x = 1
assert x > 0, "x should be positive"
如果x
大于0,上面的代码什么也不会发生。但如果x
不大于0,将会引发一个AssertionError
,并且错误消息将是"x should be positive"
2.1.3 断言函数参数
def check_positive(number):
assert number > 0, f"The number {number} is not positive"
return number
check_positive(-5)
当调用check_positive(-5)
时,会引发一个AssertionError
,因为-5
不是正数。
2.1.4 断言前后状态一致
def update_data(data, key, value):
old_value = data.get(key)
assert old_value is not None, f"Key {key} not found in data"
data[key] = value
assert data[key] == value, "Value was not updated correctly"
return data
data = {'a': 1}
update_data(data, 'a', 2)
assert
用于检查在更新字典之前键是否存在,以及更新后值是否正确
2.2 题目
如何使用断言
2.3 代码
2.3.1 tool模块代码
def addc(a, b):
return a+b
2.3.2 断言代码
import unittest
from tools import addc
class TestAdd(unittest.TestCase):
def test_3_5(self):
self.assertEqual(8, addc(3, 5))
def test_15_89(self):
self.assertEqual('sad a', addc(15, 89))
2.4 代码解释
这段代码是一个使用python的
unittest
框架编写的测试案例,它用于测试一个名为addc
的函数。这个函数应该是在另一个模块tools
中定义的
-
import unittest
: 导入了Python的标准单元测试框架unittest
,这个框架提供了创建和运行测试的工具 -
from tools import addc
: 假设tools
模块包含了一个名为addc
的函数,这里将其导入以便在测试类中使用 -
class TestAdd(unittest.TestCase)
: 定义了一个名为TestAdd
的测试类,它继承自unittest.TestCase
。这意味着它可以包含多个测试方法,每个方法都是对addc
函数的一次独立测试 -
def test_3_5(self)
: 这是一个测试方法,名字表明它正在测试addc(3, 5)
的情况。在这个方法内部,使用self.assertEqual()
来验证addc(3, 5)
的结果应该是8
-
def test_15_89(self)
: 另一个测试方法,这次测试的是addc(15, 89)
的情况。期望的结果是一个字符串'sad a'
第一个测试方法发期望
addc(3, 5)
返回8
,这是合理的;这是另一个测试方法,名为test_15_89,它测试addc函数在传入参数15和89时的行为。self.assertEqual(‘sad a’, addc(15, 89))这行代码断言addc(15, 89)的返回值是否等于字符串’sad a’。如果返回值不是’sad a’,测试将失败
三、思考
3.1 参数化
parameterized
模块不是Python标准库的一部分,需要单独安装。可以使用pip install parameterized
来安装- 在实际测试中,
login
函数应该返回一个值,该值与expect
进行比较,以验证登录功能是否按预期工作 - 如果
login
函数的返回值与expect
不匹配,测试将不会通过,并且unittest
会提供错误信息
3.2 Assert(断言)
- 断言可能会在生产环境中被禁用,因为它们可能会影响性能。python可以通过设置
-O
(优化)标志来禁用断言 - 断言不应该用于处理正常的运行时错误,它们主要用于开发和测试阶段
- 断言失败时,应该提供足够的信息来帮助调试问题,这就是为什么通常会包含一个错误消息