Python 在迭代时报告多个故障的pytest方法

Python 在迭代时报告多个故障的pytest方法,python,automated-tests,iteration,pytest,Python,Automated Tests,Iteration,Pytest,新的测试。我用它在网站上执行各种检查,包括请求和美化组模块 假设我在一个页面上获取所有的a链接,然后看到它们都返回200,那么在一个测试中就可以看到这一点。但是一次失败意味着迭代被中断,测试结束 我想要的是对所有链接进行测试,如果至少有一个失败,则生成一个报告,说明哪个失败了 有没有一个pytest成语来处理这种情况?显然,它有更广泛的应用不仅仅是检查a-链接 注意:我已经发现了pytest.mark.parametize。。。但目前还不知道这是否可以用于此类迭代。在可迭代的环境中累积测试多个项

新的测试。我用它在网站上执行各种检查,包括
请求
美化组
模块

假设我在一个页面上获取所有的a链接,然后看到它们都返回200,那么在一个测试中就可以看到这一点。但是一次失败意味着迭代被中断,测试结束

我想要的是对所有链接进行测试,如果至少有一个失败,则生成一个报告,说明哪个失败了

有没有一个pytest成语来处理这种情况?显然,它有更广泛的应用不仅仅是检查a-链接

注意:我已经发现了
pytest.mark.parametize
。。。但目前还不知道这是否可以用于此类迭代。

在可迭代的环境中累积测试多个项目的结果 要测试序列中的所有项并报告哪些项失败,可以存储失败,然后在最后使用断言

测试多个URL的示例 测试输出 累积多个断言的结果 该插件允许在每次测试中测试多个故障。它为累积多个测试失败并在测试完成后报告错误提供了基础结构

自述文件 装置 来自PYPI:

$ pip install pytest-check
或者来自github

$ pip install git+https://github.com/okken/pytest-check
用法 使用导入的示例:

导入pytest\u check作为check
def test_示例():
a=1
b=2
c=[2,4,6]
检查。更大(a,b)
检查。小于等于(b,a)
(a,c,“列表中是否有1”中的复选框
检查。是否不在(b,c,“确保2不在列表中”)
测试结果:
==================================================================失败===================================
_________________________________测试示例_________________________________
失败:
断言1>2
test_check.py,第14行,在test_example()中->check.bether(a,b)
失败:
断言2检查。小于等于(b,a)
失败:列表中的值为1
[2,4,6]中的断言1
test_check.py,第16行,在test_example()中->check.is_在(a,c,“列表中是1”)
失败:确保2不在列表中
断言2不在[2,4,6]中
test_check.py,test_example()中的第17行->check.is_not_in(b,c,“确保2不在列表中”)
------------------------------------------------------------
检查失败:4
=====================================1在0.11秒内失败===========================

正如pytest\u generate\u tests注释中所述,这是一条可行之路。 可以使用metafunc对象参数化装置链接。在测试函数中,您只需检查每个链接的返回代码。其中get all links应该返回包含链接的字符串列表

import requests

def get_all_links():
    return ["https://google.com", "https://invalidurlblahblah.com"]

def pytest_generate_tests(metafunc):
    metafunc.parametrize("link", get_all_links())

def test_all_links(link):
    try:
        assert requests.get(link).status_code == 200
    except requests.ConnectionError:
        raise AssertionError("Invalid link")
输出

pytest_example.py::test_all_links[http://google.com] PASSED                                                                                                                                                 
pytest_example.py::test_all_links[http://invalidurlblahblah.com] FAILED

我认为您正在寻找一个布尔测试结果数组和self.assertTrue(all(testResults)).IMHO答案的第一部分不是一个特定的pytest习惯用法。对于第二部分:使用插件来执行这样一个简单的任务简直是小题大做。非常感谢。在我的ISP中,当使用http时,它们都返回200,但使用https时测试正常。还有一个轻微的打字错误。。。所以我建议做一个小的修改。
=================================== FAILURES ===================================
_________________________________ test_example _________________________________
FAILURE:
assert 1 > 2
  test_check.py, line 14, in test_example() -> check.greater(a, b)
FAILURE:
assert 2 <= 1
  test_check.py, line 15, in test_example() -> check.less_equal(b, a)
FAILURE: Is 1 in the list
assert 1 in [2, 4, 6]
  test_check.py, line 16, in test_example() -> check.is_in(a, c, "Is 1 in the list")
FAILURE: make sure 2 isn't in list
assert 2 not in [2, 4, 6]
  test_check.py, line 17, in test_example() -> check.is_not_in(b, c, "make sure 2 isn't in list")
------------------------------------------------------------
Failed Checks: 4
=========================== 1 failed in 0.11 seconds ===========================
import requests

def get_all_links():
    return ["https://google.com", "https://invalidurlblahblah.com"]

def pytest_generate_tests(metafunc):
    metafunc.parametrize("link", get_all_links())

def test_all_links(link):
    try:
        assert requests.get(link).status_code == 200
    except requests.ConnectionError:
        raise AssertionError("Invalid link")
pytest_example.py::test_all_links[http://google.com] PASSED                                                                                                                                                 
pytest_example.py::test_all_links[http://invalidurlblahblah.com] FAILED