pytest文档19-doctest测试框架

前言

doctest从字面意思上看,那就是文档测试。doctest是python里面自带的一个模块,它实际上是单元测试的一种。
官方解释:doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果

doctest测试用例可以放在两个地方

  • 函数或者方法下的注释里面
  • 模块的开头

案例

先看第一个案例,将需要测试的片段,标准格式,需要运行的代码前面加>>> ,相当于进入cmd这种交互环境执行,期望的结果前面不需要加>>>

>>> multiply(4, 3)
    12
>>> multiply('a', 3)
    'aaa'

放到multiply函数的注释里

def multiply(a, b):
    """
    fuction: 两个数相乘
    >>> multiply(4, 3)
    12
    >>> multiply('a', 3)
    'aaa'
    """
    return a * b
if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

运行结果

Trying:
    multiply(4, 3)
Expecting:
    12
ok
Trying:
    multiply('a', 3)
Expecting:
    'aaa'
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.multiply
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

从运行的结果可以看出,虽然函数下方的注释里面有其它内容“fuction: 两个数相乘”,但不会去执行,只识别“>>>”这种符号。2个测试用例都是通过的,实际的结果与期望的结果一致。

失败案例

doctest的内容放到.py模块的开头也是可以识别到的

# 保存为xxx.py
'''
fuction: 两个数相乘
>>> multiply(4, 8)
12
>>> multiply('a', 5)
'aaa'
'''

def multiply(a, b):
    """
    fuction: 两个数相乘
    """
    return a * b
if __name__ == '__main__':
    import doctest
    doctest.testmod(verbose=True)

运行结果2个都失败

**********************************************************************
1 items had failures:
   2 of   2 in __main__
2 tests in 2 items.
0 passed and 2 failed.
***Test Failed*** 2 failures.

verbose参数,设置为True则在执行测试的时候会输出详细信息

cmd执行

以上案例是在编辑器直接运行的,如果在cmd里面,也可以用指令去执行

$ python -m doctest -v xxx.py

  • m 参数指定运行方式doctest
  • -v参数是verbose,带上-v参数相当于verbose=True

1070438-20180830174959676-619304357.png

pytest运行

pytest框架是可以兼容doctest用例,执行的时候加个参数 --doctest-modules ,这样它就能自动搜索到doctest的用例

$ pytest -v --doctest-modules xxx.py

1070438-20180830175015319-1487980621.png

如下是函数下的文档

fuction: 两个数相乘
>>> multiply(4, 3)
12
>>> multiply('a', 5)
'aaa'

运行结果

D:\test1122\a>pytest -v --doctest-modules  xxx.py
============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 -- d:\soft\
python3.6\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.0', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages':
{'pytest': '3.6.3', 'py': '1.5.4', 'pluggy': '0.6.0'}, 'Plugins': {'metadata': '
1.7.0', 'html': '1.19.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'D:\\soft\\j
dk18\\jdk18v'}
rootdir: D:\test1122\a, inifile:
plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
collected 1 item

xxx.py::xxx.multiply FAILED                                              [100%]

================================== FAILURES ===================================
___________________________ [doctest] xxx.multiply ____________________________
004
005     fuction: 两个数相乘
006     >>> multiply(4, 3)
007     12
008     >>> multiply('a', 5)
Expected:
    'aaa'
Got:
    'aaaaa'

D:\test1122\a\xxx.py:8: DocTestFailure
========================== 1 failed in 0.16 seconds ===========================

结果可以看出,文档里面的每一行都被执行了,当遇到测试不通过的用例时,就不会继续往下执行了

doctest独立文件

doctest内容也可以和代码抽离开,单独用一个.txt文件保存
1070438-20180830175043546-21880538.png

在当前xxx.py同一目录新建一个xxx.txt文件,写入测试的文档,要先导入该功能,导入代码前面也要加>>>

>>> from xxx import multiply
>>> multiply(4, 3)
12
>>> multiply('a', 3)
'aaa'

cmd执行“python -m doctest -v xxx.txt”测试结果


D:\test1122>python -m doctest -v  xxx.txt
Trying:
    from xxx import multiply
Expecting nothing
ok
Trying:
    multiply(4, 3)
Expecting:
    12
ok
Trying:
    multiply('a', 3)
Expecting:
    'aaa'
ok
1 items passed all tests:
   3 tests in xxx.txt
3 tests in 1 items.
3 passed and 0 failed.
Test passed.

---------------------------------pytest结合selenium自动化完整版-------------------------

全书购买地址 https://yuedu.baidu.com/ebook/902224ab27fff705cc1755270722192e4536582b

作者:上海-悠悠 QQ交流群:874033608

也可以关注下我的个人公众号:yoyoketang

1070438-20181009214319480-1673365725.jpg

<think>好的,用户想设计一个evaluate函数来筛选列表项,并编写对应的doctest用例。我需要先理解需求,然后考虑如何实现。 首先,evaluate函数的功能是筛选列表项,可能根据某种条件过滤元素。用户没有具体说明筛选条件,可能需要进一步确认,但根据常见情况,可能类似过滤偶数、特定数值范围等。不过用户提到参考引用中的内容,特别是引用[1]提到列表是可变序列类型,可能需要处理列表操作。 接下来,函数需要接收一个列表,返回筛选后的结果。例如,筛选出大于某个阈值的元素。假设用户需要一个通用的筛选条件,可能需要允许传入条件函数作为参数。或者可能根据特定需求,比如过滤掉非整数元素,或者根据某种计算规则。 然后,编写doctest用例。根据Pythondoctest规范,需要在函数文档字符串中添加示例,包括调用和预期输出。例如: def evaluate(lst): """ >>> evaluate([1, 2, 3, 4]) [2, 4] """ return [x for x in lst if x % 2 == 0] 但用户可能需要更灵活的条件。比如,用户可能希望evaluate函数根据某种业务逻辑筛选,比如保留正数,或符合某个表达式的结果。 另外,用户提供的引用中有提到RobustScaler函数(引用[3]),可能涉及数据预处理,但不确定是否相关。需要确保evaluate函数的实现符合用户需求,而用户可能需要的是数据筛选或转换功能。 测试用例需要考虑边界情况,比如空列表、不同类型元素、异常值等。例如,测试用例可能包括: >>> evaluate([-2, -1, 0, 1, 2]) [0, 1, 2] 或者根据条件过滤字符串等,但根据引用[1]中的列表类型,可能主要处理数值类型。 此外,代码需要符合Python语法,正确使用列表推导式或filter函数。同时,doctest的格式要正确,每行以>>>开头,换行后跟预期输出。 可能需要考虑函数的参数设计,比如是否允许自定义条件函数。例如: def evaluate(lst, condition): """ >>> evaluate([1, 2, 3, 4], lambda x: x % 2 == 0) [2, 4] """ return [x for x in lst if condition(x)] 但用户可能希望更具体的实现,比如固定条件,如筛选偶数或正数。需要根据用户的问题判断,但问题描述中没有明确条件,可能需要假设一个常见的情况。 假设用户需要筛选出列表中的偶数,那么实现如下: def evaluate(lst): """ 筛选列表中的偶数 >>> evaluate([1, 2, 3, 4]) [2, 4] >>> evaluate([5, 7, 9]) [] >>> evaluate([-4, 0, 6]) [-4, 0, 6] >>> evaluate([]) [] """ return [x for x in lst if x % 2 == 0] 这样,测试用例覆盖了正常情况、无符合项、负数和零,以及空列表的情况。 另外,用户提到的引用[2]和[4]涉及测试框架pytest和fixture,但当前问题主要关注doctest,可能不需要涉及这些。不过需要确保测试用例在doctest中能正确运行。 最后,确保代码格式正确,使用正确的缩进,并在文档字符串中添加测试案例。同时,引用[1]指出列表是可变序列类型,因此在函数中应避免修改原列表,而是返回新列表,以符合最佳实践。</think>### 实现`evaluate`函数筛选列表项及编写`doctest`用例 #### 功能需求 假设`evaluate`函数的目标是筛选列表中满足特定条件的元素。例如: - 筛选出**正偶数**(大于0且能被2整除的数) - 同时支持整数和浮点数类型,但浮点数需满足严格数值条件 #### 实现代码 ```python def evaluate(lst): """ 筛选列表中大于0的偶数(支持整型和浮点型) Examples: >>> evaluate([-3, -2, 0, 1.5, 2, 4.0, 5]) [2, 4.0] >>> evaluate([0, 0.0, -4, 6.2]) [] >>> evaluate([]) [] >>> evaluate([2, "hello", 3.14]) # 处理非数值类型 [2] """ result = [] for item in lst: if isinstance(item, (int, float)): if (item > 0) and (item % 2 == 0): result.append(item) return result ``` #### 关键点说明 1. **类型检查**:使用`isinstance(item, (int, float))`过滤非数值元素[^1] 2. **正偶数条件**:`item > 0`确保正数,`item % 2 == 0`确保偶数性 3. **浮点兼容性**:浮点数满足条件时会被保留(如`4.0`) #### 测试用例设计 | 测试场景 | 输入列表 | 预期输出 | 验证点 | |-------------------------|-------------------------------|-------------|----------------------| | 混合类型 | `[-3, -2, 0, 1.5, 2, 4.0, 5]` | `[2, 4.0]` | 正偶数筛选 | | 边界值 | `[0, 0.0, -4, 6.2]` | `[]` | 非正数过滤 | | 空列表 | `[]` | `[]` | 容错处理 | | 含非数值元素 | `[2, "hello", 3.14]` | `[2]` | 类型过滤 | #### 运行测试 通过以下命令执行`doctest`: ```bash python -m doctest -v your_module.py ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值