python pytest 总结与答疑

课前准备

  • 看完本章节所有课程内容
  • 完成作业,优先回答和作业相关的问题
  • 相关问题在评论区回复

上课内容

  • 梳理知识点
  • 讲解作业
  • 答疑

知识点梳理

链接: 百度网盘 请输入提取码 提取码: 6nnx

相关链接

本章演示代码

https://gitlab.stuq.ceshiren.com/lg/lg10/hogwartslg10

课后调查表

作业

  • 课后作业
    • 1、补全计算器(加法 除法)的测试用例
    • 2、使用参数化完成测试用例的自动生成
    • 3、在调用测试方法之前打印【开始计算】,在调用测试方法之后打印【计算结束】
  • 注意:
    • 使用等价类,边界值,因果图等设计测试用例
    • 测试用例中添加断言,验证结果
    • 灵活使用 setup(), teardown() , setup_class(), teardown_class()

设计测试用例

加法

  • 正常的情况

    • 整数
    • 为0
    • 大数
    • 负数
  • 小数的情况

  • 异常的情况

    • 字符型

除法

  • 正常的情况
    • 整数
    • 为0
    • 大数
    • 负数
  • 小数情况
  • 异常情况
    • 除数为0
    • 类型错误

老师,问几个问题:

  1. @pytest.mark.parametrize((‘args’, ‘expected’),yamOpera.load_case(path)) yml加载用例的load_case方法用@allure.step(‘加载测试用例数据’) 标记后 为什么没有在allure中体现步骤
    2.pytest.ini 文件配置日志文件路径 怎么能追加写日志 或者说生成每次运行按照时间命名的日志文件
    3.如果想在setup_class中调用接封装好的接口在测试用例运行前通过调用接口更改配置用于后续测试或者一些数据库类初始化数据 貌似setup_class不能用fixtrue 怎么实现

问题1:
你写的读取 yaml 的方法 yamlOpera.load_case() 会提前被初始化, allure只能收集到开始执行用例之后的allure 数据信息。
比如:提前创建了fixture ,fixture 中allure.step() 它也不会被加到测试报告中。

问题2: 可以参考贴子,pytest logging 收集日志 ,后面有个学员给出了解决方案。
就是创建一个fixture 函数,设置一下日志路径,每次生成一个动态的时间戳作为文件名。

问题3: 没太理解你的意思,
是想要在setup_class() 之前还要做一些初始化的设置么?
那为什么不直接放在setup_class 里面,或者 放在setup_module() 。

也可以定义 一个fixture ,fixture 会优于setup 先执行。

明白了 第三个我表述的不好 可以定义其他fixture解决 现在想通了 谢谢老师解答


老师 我用 with pytest.raises同时捕获多个异常 报这个错 应该咋解决

image

用直播课说的异常情况的参数处理又报TypeError: expected exception must be a BaseException type, not str

当有多个异常时,要把这些异常放在元组中,这个用法与 try…except是类似的。例如:

def test_a():
    with pytest.raises((ZeroDivisionError,TypeError)) :
        1/0

检查一下你的rai_datas的数据。我这边没有问题

@pytest.mark.parametrize("a,b,errortype",[
    [1,0,ZeroDivisionError],['a','b',TypeError]
])
def test_b(a,b,errortype):
    with pytest.raises(errortype):
        a/b
        raise ValueError()

好的老师 问题已经解决了 谢谢老师

同样的数据 我放在yaml里的rai_datas就不行 就报TypeError: expected exception must be a BaseException type, not str 直接放在代码里就可以执行通过了
lagou05/testing_calc at master · daiy96/lagou05 · GitHub 这是我GitHub地址 老师在帮忙看下呢

ZeroDivisionError TypeError 这种错误类型放在yaml文件中,它会认为是一个字符串,yaml 文件不支持错误类型,读取出来到python中将会是字符串,
需要使用 eval() 方法转成 对象,再在代码里做判断

pytest.raise(eval('ZeroDivisionError'))

谢谢老师 问题已经解决了