python如何自动调用符合特征的函数

出自:爱快官方技术博客

作者:爱快老高


随着产品功能的日益丰富和复杂,我们的团队依然保持一个比较快的迭代速度。因为是小公司,测试团队并不大,这就给测试工作带来了很大的压力。为了保证产品的发布质量,我们开始引入自动化测试。

自动化测试语言选择的是Python。主要原因有两个:1. Python语法简单清晰,适合没有编程经验的同学上手;2. Python语言具有丰富的库,便于迅速编程。Python有多个单元测试框架,但经过调研,并不太适合我们的自动化测试环境。因此,我们选择搭建自己的自动化测试框架。Web页面的自动化测试,选择Selenium来作为支持库,而控制台则选择paramiko,用于ssh连接控制,下发命令或者获取命令输出。

在搭建自动化测试框架的时候,有一项工作是必须要支持的。一般情况下,一个test case就是一个函数,那么我们希望测试的同学只需创建一个test case,而无需更改其它代码,Python就可以自动调用这个test case。

如下面的代码示例:

class TestSuite:
    def test_case1(self):
        print("test_case1")

    def test_case2(self):
        print("test_case2")

    def test_case3(self):
        print("test_case3")

    def run_tests(self):
        self.test_case1()
        self.test_case2()
        self.test_case3()

if __name__ == "__main__":
    test_suite = TestSuite()
    test_suite.run_tests()

这里有三个test case,由run_tests逐个调用。这样当测试人员新加入一个test case时,他们还需要修改run_tests。这不仅麻烦,而且会造成run_tests越来越长,代码不仅丑陋,而且还会增加维护成本。

我们需要一种让python自动调用某些函数的方案,测试人员只需要增加test case,而run_tests函数会自动调用所有的test case。这时,就显示了python作为动态编程语言的功能强大了。只需做一个很简单的修改即可,代码示例如下:

#!/usr/bin/python3
from types import FunctionType

class TestSuite:
    def test_case1(self):
        print("test_case1")

    def test_case2(self):
        print("test_case2")

    def test_case3(self):
        print("test_case3")

    def run_tests(self):
        # 获得TestSuite的符号表
        for name, func in TestSuite.__dict__.items():
            # 其符号类型为函数,并且名字是以test开头
            if type(func) == FunctionType and name.startswith("test"):
                func(self)

if __name__ == "__main__":
    test_suite = TestSuite()
    test_suite.run_tests()

以上代码,测试人员只需要增加以test开头的测试案例代码,在run_tests函数中,就会自动调用所有以test开头的函数。因为__dict__是字典结果,所以如果有排序的需求,只需根据自己的需求进行sort即可按顺序调用。

 


爱快技术博客blog.ikuai8.com —— 爱快老高出品

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注