文字测试用例可以便于我们理解测试设计和测试目的。但是要维护两份用例(文字和脚本)让人觉得麻烦,久而久之文字用例没有更新,带来不一致,反而会引起误解。最好的办法是将文字用例和脚本用例放在一起。
但是脚本用例非常分散,而文字用例通常希望放在一起(列表中)来看,因此将文字用例从脚本中导出非常有必要。
#test info field names
fields = ('goal:', 'step:', 'wanted:')
#match <td>...</td>
td = '<td>[\s\S]*?</td>'
class ExportTestInfoProgram(TestProgram):
'''
export info of test method to html
'''
@staticmethod
def gettestdesc(test):
desc = getattr(test, test._testMethodName).__doc__
if None == desc:
return '%s%s%s' % ('<tr>', '<td></td>' * len(fields), '</tr>')
values = re.findall(td, desc)
names = re.split(td, desc)
ret = '<tr>'
for field in fields:
found = False
for i in range(len(names)):
if field == names[i].strip():
ret += values[i].replace('\n', '<br>') #replace \n to html br
found = True
break
if not found:
ret += '<td></td>'
return ret + '</tr>'
def runTests(self):
def _printTest(test):
if isinstance(test, TestSuite):
for child in test:
_printTest(child)
elif isinstance(test, TestCase):
#do nothing except print test case info
print ExportTestInfoProgram.gettestdesc(test)
_printTest(self.test)
class testdemo2(TestCase):
#use <td></td> to split fields and define html format
def test111(self):
'''
goal:<td>test111</td>
step:<td>1.hello
2.world</td>
wanted:<td>hello world</td>
desc:<td>test
case</td>
'''
pass
def test222(self):
'''
goal:<td>touch screen
and
click button</td>
wanted:<td>1.touch
2.click</td>
'''
pass
if __name__ == "__main__":
ExportTestInfoProgram()
执行的结果是
<tr><td>test111</td><td>1.hello<br>2.world</td><td>hello world</td></tr>
<tr><td>touch screen<br>and<br>click button</td><td></td><td>1.touch<br>2.click</td></tr>
再稍作加工我们就能得到一份html的文本用例了。