从Python类/对象列表中动态调用方法

时间:2012-03-09 05:08:10

标签: python oop dynamic

我有X个python类,它们都继承自同一个抽象基类,它希望子类实现一个名为executeTest()的方法

Class TestCase:
   def executeTest():
   #do some logic for the test, then return if it passed or failed

在我的主程序中,我需要加载每个类的一个实例,一次一个地继承这个基类,调用executeTest(),并将结果记录到某种集合中供以后使用。实现TestCase的类数量将随着时间的推移而持续增长,因为人们会想到要编写的新测试。

我怎样才能在python中有效地做到这一点?我是否需要一个单独的XML或类似的类型文件,其中包含所有单个类名的列表,然后在for循环中使用某种类加载函数?这是我在python中的第一个晚上编码所以我甚至不确定要搜索哪些技术或关键字。

3 个答案:

答案 0 :(得分:2)

这是一个元回答 - 这意味着我认为你应该考虑你的设计调用测试。

在python中有很好的方法来编写测试。 [1] 还有一些工具可以收集所有可用的测试并执行它们(包括统计数据,覆盖范围,xml输出......)。 [2]

如果我是你,我会看看他们。如果你可以使用它们,就没有必要重新发明轮子了。

[1] http://docs.python.org/library/unittest.html
[2] http://readthedocs.org/docs/nose/en/latest/

答案 1 :(得分:0)

使用装饰器枚举类,并使用列表推导执行方法。

答案 2 :(得分:0)

我会尝试这样做:

1)将您的抽象类保存在test_case.py

class TestCase:
    def executeTest():
        #do some logic for the test, then return if it passed or failed

2)将所有子课保存在test_case_children.py

from test_case import TestCase
class Test_Case_1(TestCase):
    def executeTest():
        #overriden function

class Test_Case_2(TestCase):
    def executeTest():
        #overriden function

class Test_Case_3(TestCase):
    def executeTest():
        #overriden function

3)将主要功能保存在main.py

from test_case import TestCase
import test_case_children

def main():
    #grab the all the elements in the script 'test_case_children'
    items = test_case_children.__dict__

    #build list of all 'TestCase' sub-classes
    test_classes = [] 
    for (key, value) in items.items():
        try:
            # check whether the item is a sub-class of 'TestCase' class
            if TestCase.__subclasscheck__(value):
                test_classes.append(value)
        except TypeError: #if item is not of type 'TestCase', ignore it
            pass

    #run the tests
    for test_class in test_classes:
        test_runner = test_class()
        test_runner.executeTest()


# this will run main() method, only when script is directly executed 
# from shell or command prompt ...
if __name__ == "__main__":
    main()

4)执行main.py脚本:

$ python main.py

注意:还有一件事,保存这些文件的文件夹还应该包含一个空的__init__.py文件,使该文件夹成为python app(类似packages } Java中的namespacesC++中的<root>/ ------>test_case/ ---------------->__init__.py ---------------->main.py ---------------->test_case.py ---------------->test_case_children/ --------------------------------->__init__.py --------------------------------->test_case_1.py --------------------------------->test_case_2.py --------------------------------->test_case_3.py 。如果你不这样做,那些导入语句可能不起作用。

[从不同文件运行test_cases的更新]

1)将文件保存在以下层面:

test_case/test_case.py

2)将您的抽象类保存在class TestCase: def executeTest(): #do some logic for the test, then return if it passed or failed

test_case/test_case_children/test_case_1.py

3)保存这样的子类:

档案:from test_case.test_case import TestCase class Test_Case_1(TestCase): def executeTest(): #overriden function

test_case/test_case_children/test_case_2.py

档案:from test_case.test_case import TestCase class Test_Case_2(TestCase): def executeTest(): #overriden function

test_case/test_case_children/test_case_3.py

档案:from test_case.test_case import TestCase class Test_Case_3(TestCase): def executeTest(): #overriden function

main.py

4)将主要功能保存在from test_case import TestCase from test_case import test_case_children def main(): #grab the all the elements in the module 'test_case_children' items = test_case_children.__dict__ #build list of all 'TestCase' sub-classes test_classes = [] for (dict_key, dict_value) in items: #check whether the type of item's value is a module, # if its a module it's likely to contain a TestCase subclass... if str(type(dict_value)) == "<type 'module'>": for (key, value) in dict_value.items(): try: # check whether the item is a sub-class of 'TestCase' class if TestCase.__subclasscheck__(value): test_classes.append(value) except TypeError: #if item is not of type 'TestCase', ignore it pass #run the tests for test_class in test_classes: test_runner = test_class() test_runner.executeTest() # this will run main() method, only when script is directly executed # from shell or command prompt ... if __name__ == "__main__": main()

main.py

5)执行$ cd test_case/ $ python main.py 脚本:

{{1}}

我希望这对你有用。