简体   繁体   English

如何从python中的文件(json或yaml)动态创建参数化测试

[英]How to dynamically create parameterized test from the file (json or yaml) in python

Really need an advice how to dynamically create parameterized tests from the file (json or yaml) in python.真的需要一个建议,如何从 python 中的文件(json 或 yaml)动态创建参数化测试。 File contains list of urls文件包含网址列表

file example :文件示例:

 { "name":"url_1", "url":"http://check.com","expected": "23"}

or :或者 :

{ "url_1", "http://check.com","23"}

Example like this:像这样的例子:

@parameterized(from the file import name, expected)

def testUrl (self, name, url, expected):
    run something (%s) url
    assertTrue( expected = result)

OUTPUT :输出 :

test_for_url_1_ (test.TestClass) ... ok
test_for_url_2_ (test.TestClass) ... ok

I'm checking nose-parameterized for:我正在检查鼻子参数化:

# An iterable of params
@parameterized(
    param.explicit(*json.loads(line))
    for line in open("testcases.jsons")
)
def test_from_json_file(...):
    ...

But can't make it work :(但不能让它工作:(

Thank you in advance先感谢您

In case you just want to pass params from file to single function:如果您只想将参数从文件传递给单个函数:

Yes, you can use decorator, pass filename to it, load json from file and use as decorated func's params:是的,您可以使用装饰器,将文件名传递给它,从文件加载 json 并用作装饰函数的参数:

import json
from functools import wraps


def params_from_file(file):
    """Decorator to load params from json file."""
    def decorator(func_to_decorate):
        @wraps(func_to_decorate)
        def wrapper(self, *args, **kwargs):
            with open(file, 'r') as fh:
                kwargs = json.loads(fh.read())
                return func_to_decorate(self, **kwargs)
        return wrapper
    return decorator

Usage:用法:

import unittest


class Test(unittest.TestCase):
    @params_from_file('file.txt')  # {"name":"url_1", "url":"http://check.com", "expected": "23"}
    def test_url(self, name, url, expected):        
        self.assertEqual(name, 'url_1')
        self.assertEqual(url, 'http://check.com')
        self.assertEqual(expected, '23')
        # print(name, url, expected)


if __name__ == "__main__":
    unittest.main()

In case you want to create multiple new tests from params set:如果您想从参数集创建多个新测试:

import json


def create_tests(func_name, file):
    def decorator(cls):
        func = getattr(cls, func_name)
        # Set new funcs to class:
        with open(file, 'r') as fh:
            data = json.loads(fh.read())['data']
            for i, params in enumerate(data):
                def tmp(params=params):  # need for http://stackoverflow.com/q/7546285/1113207
                    def wrapper(self, *args, **kwargs):
                        return func(self, **params)      
                    return wrapper          
                setattr(cls, func_name + '_' + str(i), tmp())
        # Remove func from class:
        setattr(cls, func_name, None)
        return cls
    return decorator

Usage:用法:

import unittest


@create_tests('test_url', 'file.txt')
class Test(unittest.TestCase):
    def test_url(self, name, url, expected):
        print(name, url, expected)


if __name__ == "__main__":
    unittest.main(verbosity=2)

Output:输出:

test_url_0 (__main__.Test) ... name1 https://example.com 175
ok
test_url_1 (__main__.Test) ... name2 https://example2.com 15
ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM