如何编写验证反射方法名称和参数的方法

时间:2011-10-14 06:58:45

标签: python

我们使用Python webdriver编写了Selenium测试核心。主要思想是从CSV文件中读取格式为:

method_name,parameter 1,parameter 2, parameter 3, ..., parameter n

然后通过使用反射,测试核心将根据“方法名称”和参数调用方法。

def runTest(self):
        try:
            test_case_reader = csv.reader(open(self.file_path, 'rb'), delimiter=',')
            self.logger.info("Running test case %s" % self.file_path)
            for row in test_case_reader:
                if (len(row) > 1):
                    method_name, parameters = row[0], row[1:]
                    parameters = filter(None, parameters)
                    method = getattr(self, method_name)
                    self.logger.info("executing method %s parameters %s" % (method_name, parameters))
                    method(*parameters)
                    self.wait()
        except AssertionError, e:
            self.logger.error(e)
            self.fail("Test case failed: %s" % self.file_path)

这个脚本的主要思想是提供更好的生产力和易用性,因为QA不必与python代码交互来编写自动化测试用例。

但由于人为错误,有时会出现拼写错误或参数不匹配。

因此,如果方法名称和参数正确,我将添加一个方法来验证所有CSV文件。有没有内置的反射来进行这种检查?

更新

对于参数,我想检查参数计数是否与方法的必需参数匹配。有些方法也有可选参数。

示例:

method_1 (parameter1, parameter2, parameter3, parameter4 = None, parameter5 = None)

对于method_1,有效参数计数为:3,4和5。

答案:

不完美&整洁的解决方案,但这是现在的方法,它的工作:

def verifyFile(self):
    test_case_reader = csv.reader(open(self.file_path, 'rb'), delimiter=',')
    for row in test_case_reader:
        if (len(row) <= 1):
            break

        method_name, parameters = row[0], row[1:]
        if (method_name == ''):
            break

        parameters = filter(None, parameters)
        if not hasattr(self, method_name):
            self.logger.error("test case '%s' method name '%s': Method not found" % (self.file_path, method_name))
            break
        t = inspect.getargspec(getattr(self, method_name))
        max = len(t.args)
        if (type(t.defaults) == NoneType):
            min = max
        else:
            min = max - len(t.defaults)
        if not min <= len(parameters) + 1 <= max:
            self.logger.error("test case '%s' method name '%s': Parameter count not matches (%d - %d)" % (self.file_path, method_name, min, max))

1 个答案:

答案 0 :(得分:0)

对于该方法,您可以轻松调用hasattr以查看它是否存在。在你的情况下,它只是:

for row in test_case_reader:
    method_name = get_method_name() # Your code here
    if not hasattr(self, method_name):
        self.logger.error("No method name %s", method_name)

对于参数,它有点复杂,因为python是一种动态语言。您可能想要使用参数检查或合同库。如果参数问题足够简单,可能会有一个更简单的解决方案。你想检查什么参数?

编辑:

对于参数,您可以使用inspect.getargspec来获取函数的参数数量,并检查它是否正确。

def check_args(func, n):
    args, varargs, keywords, defaults = inspect.getargspec(func)
    max = len(arg)
    min = max - len(defaults)
    if not min <= n <= max:
        # error

这不考虑*args**kwargs的使用,但您可以轻松更改它。