1

我正在使用该pytest框架为 python 应用程序编写一些测试。我在其中一项测试中遇到问题,我不确定它的工作方式。

例子:

@pytest.mark.parametrize("result, status, xml_err, xml_status",[
        ("PASS",True,False,"XML_ERROR"),
        ("Validation error", False, False, "XML_ERROR")
    ])
def test_xml_build_neg(self, monkeypatch,result, status, xml_err, xml_status):

    def validate(self):
        return status, result, {}

    def transform(self, v_dict):
        return "<xml/>", 50.0, xml_status, xml_err



    monkeypatch.setattr(DataValidator, "validate", validate)
    monkeypatch.setattr(XMLTransformer, "transform", transform)


    o_result, o_status, o_xml_err, o_xml_status= XMLOutputBuilder().build(ExtractionResult(), "test", b"test")

    assert o_result == result, "Validation results not matching"
    assert o_status == status, "Validation Status not matching"
    .....

我做monkeypatch了一些我内部的方法XMLOutputBuilder来测试一些错误场景。我希望我的模拟方法会根据传入的参数返回值,但事实并非如此。我理解这种行为是因为模拟和固定装置只加载一次并且不能进一步更改(如果我错了,请纠正我)。

有没有其他方法可以使这种情况起作用?或者我必须为参数编写单独的测试方法?

4

1 回答 1

0

我无法重现问题。可能执行的代码路径与设置的 monkeypatch 属性不同。

在下面的最小示例中,我在您的示例中添加了一些复杂性:A模块a.py中具有validate要修补的功能的类:

class A:
    def validate(self):
        status, result = "not", "patched"
        return status, result

模块中的类使用B模块中类的b.py功能:Aa.py

import a
class B():

    def build(self):
        return a.A().validate()

一个测试模块test.py

import pytest
from a import A
from b import B

@pytest.mark.parametrize("arg1, arg2", [("foo1", "bar1"), ("foo2", "bar2")])
def test_monkeypatch_with_params(monkeypatch, arg1, arg2):

    def validate(self):
        print(arg1, arg2)
        return arg1, arg2

    monkeypatch.setattr(A, "validate", validate)

    actual_status, actual_result = B().build()
    assert actual_status == arg1
    assert actual_result == arg2

执行为:

pytest test.py -s 
于 2020-03-13T09:48:11.970 回答