有时我们需要更加精确灵活的指定用例的执行,比如重复,循环,顺序等。
通过将代表TestMethod名的字符串翻译并组合成TestSuite的方法,可以降低定义的难度,以一种类配置文件的方式进行,而非python代码,这样没有编程经验的测试人员也可以通过编辑文本来选择和组合用例。示例如下:
from unittest import TestProgram, TestCase, TestSuite
from unittest import runner
import sys, types
class testdemo1(TestCase):
def testAAA(self):
print 'testAAA'
def testBBB(self):
print 'testBBB'
class testdemo2(TestCase):
def test111(self):
print 'test111'
def test222(self):
print 'test222'
##############################
def testSelector(allTestMethods):
#user define which testMethod and how many times to be ran
#format: TestCase.TestMethod[:times]
selectedMethods = [
'testdemo1.testBBB:2', #run testBBB 2 time(s)
'testdemo2.test222:3', #run test222 3 time(s)
'testdemo1.testAAA', #run testAAA 1 time(s)
'testdemo4.testXXX', #not exist, not run
]
suite = TestSuite()
for aTestMethod in selectedMethods:
#if user define times
if ':' in aTestMethod:
methodInfo = aTestMethod.split(':')
methodName = methodInfo[0]
methodTimes = int(methodInfo[1])
#user don't define times, then should be 1
else:
methodName = aTestMethod
methodTimes = 1
if methodName in allTestMethods.keys():
for i in range(0, methodTimes):
suite.addTest(allTestMethods[methodName])
return suite
#use testSelector to filter testMethods which to be ran
def getAllTestMethods(suite):
allTestMethods = {}
for child in suite._tests:
if isinstance(child, TestCase):
#the format of TestCase like: 'testAAA (__main__.testdemo1)'
#change to 'testdemo1.testAAA'
methodInfo = str(child).split(' ')
methodStr = child.__class__.__name__ + '.' + methodInfo[0]
allTestMethods[methodStr] = child
elif isinstance(child, TestSuite):
allTestMethods.update(getAllTestMethods(child))
return allTestMethods
class UserDefineTestMethodTestProgram(TestProgram):
def runTests(self):
if self.catchbreak:
installHandler()
if self.testRunner is None:
self.testRunner = runner.TextTestRunner
if isinstance(self.testRunner, (type, types.ClassType)):
try:
testRunner = self.testRunner(verbosity=self.verbosity,
failfast=self.failfast,
buffer=self.buffer)
except TypeError:
testRunner = self.testRunner()
else:
testRunner = self.testRunner
#critical change
#use testSelector to filter testMethods which to be ran
#self.result = testRunner.run(self.test)
self.result = testRunner.run(testSelector(getAllTestMethods(self.test)))
if self.exit:
sys.exit(not self.result.wasSuccessful())
##############################
if __name__ == '__main__':
UserDefineTestMethodTestProgram()
得到的测试结果是:
testBBB
testBBB
test222
test222
test222
testAAA
根据这个思路,还可以扩展出其他的用例选择器(testSelector),以便灵活的组织各种测试场景。
由于之前的账号【ist】注册邮箱一直修改不成功,无奈重新注册一个账号,将之前的帖子搬过来,原帖删除。