在py.test的每个参数化规范内巧妙更改的全局参数

时间:2018-08-17 17:49:02

标签: python unit-testing pytest

对于我的情况,我希望能够验证我的验证功能是否正常运行。因此,这意味着我需要能够提供正在验证的json对象的所有可能输入的组合。我期望的json具有以下格式,并且需要以下类型和键:

{ 
  "id": str, 
  "name": str, 
  "item_list": list, 
  "language_list": list, 
  "number", int 
} 

所以一个例子是:

myDict= dict({
    "id": 'test_id',
    'name': 'test_name',
    'item_list': ['foo', 'bar'],
    'language_list': ['spanish', 'english'],
    'number': 2
})

我目前有类似以下的内容,以测试是否正确处理了错误的输入。


({ @pytest.mark.parametrize("test_input", [
    ({
        "id": 1,
        "name": "test_name",
        "item_list": ["foo", "bar"],
        "language_list": ["spanish", "english"],
        "number": 2
    }),
    ({
        "id": ["some", "list"],
        "name": "test_name",
        "item_list": ["foo", "bar"],
        "language_list": ["spanish", "english"],
        "number": 2
    }),
    ({
        "id": {"another_key": "another_value"},
        "name": "test_name",
        "item_list": ["foo", "bar"],
        "language_list": ["spanish", "english"],
        "number": 2
    }),
    .
    .
    .

])
def test_validate_json_error(test_input):
    # dont worry about the below. Im just handling the input
    with pytest.raises(CustomFlaskError):
        validate_json(test_input)

})

我希望能够对字典中的所有键执行此操作。那么有没有一种方法可以更简洁地做到这一点?因此,也许将myDict的正确示例定义为一个全局变量,然后在每个参数中对其进行一些更改。如下所示:

({ @pytest.mark.parametrize("test_input", [
    (myDict["id"] = 1),
    (myDict["id"] = ["some", "list"]),
    (myDict["id"] = {"another_key": "another_value"}),
    .
    .
    .

])
def test_validate_json_error(test_input):
    # dont worry about the below. Im just handling the input
    with pytest.raises(CustomFlaskError):
        validate_json(test_input)

})

这看起来要好得多,尤其是那些带有大量键的json对象。

1 个答案:

答案 0 :(得分:0)

我知道了。

我只需要有一个执行变量浅表副本的函数,该函数也将要在json中更改的键替换为我想要替换的值。它返回更改后的浅表副本,然后将其用于参数化。

因此,以下方法可行

x = require('test.js')
if ( x has function defined myFunc ) {
  if ( function myFunc in x has 3 arguments) {
     "OK"
  } else { "Expect 3 params"}
} else { 
  "test.js does not expose myFunc" }