我有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中的第一个晚上编码所以我甚至不确定要搜索哪些技术或关键字。
答案 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
中的namespaces
或C++
中的<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}}
我希望这对你有用。