pyunit扩展:集中定义要执行的用例

有时我们需要更加精确灵活的指定用例的执行,比如重复,循环,顺序等。

通过将代表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】注册邮箱一直修改不成功,无奈重新注册一个账号,将之前的帖子搬过来,原帖删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值