测试人社区

20210224【pytest测试框架实战训练营】最火python 测试框架与接口测试技巧

pytest 测试框架实战训练营

WechatIMG1905

pytest 用例识别与规范

  • 测试文件
    • test_*.py
    • *_test.py
  • 用例识别
    • Test*类包含的所有test_*的方法(测试类不能带有__init__方法)
    • 不在class中的所有的test_*方法
  • pytest也可以执行unittest框架写的用例和方法

测试用例的识别与运行

  • 终端执行
    • pytest/py.test
    • pytest –v (最高级别信息–verbose) 打印详细运行日志信息
    • pytest -v -s 文件名 (s是带控制台输出结果,也是输出详细)
    • pytest 文件名.py 执行单独一个pytest模块
    • pytest 文件名.py::类名 运行某个模块里面某个类
    • pytest 文件名.py::类名::方法名 运行某个模块里面某个类里面的方法
  • 报错停止运行
    • pytest -x 文件名 一旦运行到报错,就停止 运行
    • pytest - -maxfail=[num] 当运行错误达到num的时候就停止 运行
    • pytest -k "类名 and not 方法名” 执行某个关键字的用全
    • pytest -m [标记名] @pytest.mark.[标记名] 将运行有这个标记的测试用例

pycharm 执行 配置

参数化与数据驱动

  • 概念
  • 参数化?
    • 待测试的输入和输出是一组数据, 可以把测试数据组织起来,用不同的测试数据调用相同的测试方法
  • 数据驱动?
    • 数据驱动就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。
  • 参考代码:
"""
__author__ = 'hogwarts_xixi'
__time__ = '2021/2/24 8:51 下午'
"""
import pytest
import yaml

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

def get_data():
    with open("./datas.yml") as f:
        # yaml.safe_load 将yaml 数据格式 加载成python数据对象
        datas = yaml.safe_load(f)
    return datas


def test_get_datas():
    print(get_data())

# json, excel, xml, yaml
@pytest.mark.parametrize(['a','b','expect'],get_data(),ids=["int","int1","int2","int3"])
def test_add_int(a,b,expect):
    assert expect == add(a,b)

@pytest.mark.parametrize("a,b,expect",[
    [0.1,0.1,0.2],[0.1,0.2,0.3]
])
def test_add_float(a,b,expect):
    assert round(add(a,b),2) == expect

# Decial hamcrest


def test_add_minus():
    pass

思考题

参数化,跟 将测试数据写在一个测试文件中进行for循环有什么区别?

接口实战

@pytest.mark.parametrize("topic_id",[10232,10222,10212])
def test_ceshiren(topic_id):
    result = requests.get(f"https://ceshiren.com/t/topic/{topic_id}.json")
    # print(result.json()['id'])
    assert topic_id == result.json()['id']

课后作业

找个自己公司的接口,或者使用 测试人论坛(20210224【pytest测试框架实战训练营】最火python 测试框架与接口测试技巧),回复贴子,找到自己的姓名,并验证,使用参数化功能,验证多个回复人的姓名

沙发

板凳

站着看

练习

测试人

测试人

测试练习

新人报道

沙发,测试人

请老师看看课后作业这么做行吗?

@pytest.mark.parametrize("username",['xixi-tech','wangke','li929','yiyiran','jimzhang','wengzi','mistory','Change_TE'])
def test_ceshiren(username):
    result = requests.get("https://ceshiren.com/t/topic/10232.json")
    username = result.json()['details']['participants']
    assert result.json()['details']['participants'] == username

代码要 加上``` 代码 ```` 三个反引号,才是markdown格式。

你这样参数化是没问题的, 但是结果肯定是一直pass 因为你定义了username = result.json()['details']['participants'] 所以肯定一直是通过的, 这个username 应该 取个其它的名字 , 跟参数的名字冲突了。

把名字改了你这样写就不对了。

代码要 加上``` 代码 ```` 三个反引号,这个是什么意思?
我把username = result.json()[‘details’][‘participants’]这句删除是不是就可以了?

我已经帮你改了,看你的代码

对,把那句删了,就会发现代码的问题,这样写逻辑是有问题的

我把那句代码删除了以后就报错了,我打印了一下,一直获取的是同一个username呢?不明白问题在哪儿,求指教

小板凳

你想要拿到你想要的name,首先要分析它的结构,如下图

result['post_stream']['posts'] 这样可以获取到一个列表,因为posts下面有很多数据,可以使用for循环,把name这个字段都拿出来放在列表中 ,然后 再判断,你要找的名字 ,是否在这个列表中。

更简单的用法是使用 jsonpath 会更容易实现。

怎么查看抓取到的网页的json数据结构呢

  • 你是想问如何抓取,还是说抓取到了如何查看?

抓取到了如何查看的话? 就是安装个chrome 在线插件 ,或者使用一个在线解析 json 的工具就可以了。

如何抓取的话,需要使用抓接口的工具,或者在chrome 右键 检查,选择network