Python 如何编写方法来验证反射方法名称和参数
我们使用PythonWebDriver编写了一个Selenium测试核心。主要思想是从CSV文件中读取以下格式:Python 如何编写方法来验证反射方法名称和参数,python,Python,我们使用PythonWebDriver编写了一个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,
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文件,如果方法名称和参数是正确的。是否有任何内置的反射来执行这种检查
更新:
对于参数,我想检查参数计数是否与方法所需的参数匹配。有些方法也有可选参数
例如:
方法_1参数1、参数2、参数3、参数4=None、参数5=None
对于方法_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))
对于该方法,您可以轻松调用以查看它是否存在。就你而言,它只是:
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是一种动态语言。您可能希望使用参数检查或合同库。如果参数问题足够简单,可能会有更简单的解决方案。关于参数,您想检查什么
编辑:
对于参数,可以使用获取函数的参数数并检查其是否正确
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的使用,但您可以很容易地将其更改为这样做。Hi Madjar,谢谢您的回答。关于参数验证,我更新了我的问题。