对于用例中的关键步骤,如果能在日志中打印出来并自动编号,则分析日志的时候会比较方便。
如下代码引入step方法,自动对每个用例的日志进行编号,且可以设置编号的级别:
stepid = [0]
steplevel = 0
def initstep():
global stepid, steplevel
stepid, steplevel = [0], 0
def step(msg, level=0, id=None): #user can define level and id
global stepid, steplevel
if level == steplevel:
if None == id:
stepid[level] += 1
else:
stepid[level] = id
elif level > steplevel: #level should = steplevel + 1
if None == id:
stepid.append(1)
else:
stepid.append(id)
steplevel += 1
else:
stepid = stepid[:level + 1]
if None == id:
stepid[level] += 1
else:
stepid[level] = id
steplevel = level
prefix = 'Step-' + '.'.join([str(id) for id in stepid]) + ': '
print prefix + msg
class StepTestResult(TextTestResult):
def addSuccess(self, test):
super(StepTestResult, self).addSuccess(test)
initstep()
def addError(self, test, err):
super(StepTestResult, self).addError(test, err)
initstep()
def addFailure(self, test, err):
super(StepTestResult, self).addFailure(test, err)
initstep()
if __name__ == '__main__':
TestProgram(testRunner=TextTestRunner(resultclass=StepTestResult))
测试用例如下:
class test1(TestCase):
def testaaa(self):
step('a')
step('b', 0, 7)
step('c')
step('d', 1)
step('e', 2)
step('f', 1)
step('g')
def testbbb(self):
step('a')
step('b', 1)
step('c')
fail('xxx')
step('d', 1)
step('e', 2)
step('f', 1)
step('g')
class test2(TestCase):
def testccc(self):
step('a')
step('b', 0, 7)
step('c')
for i in range(5):
#use different id in loop
step('d', 1)
step('f', 1)
step('g')
def testddd(self):
step('a')
step('b', 0, 7)
step('c')
for i in range(5):
#use same id in loop
step('d', 1, 3)
step('f', 1)
step('g')
运行结果:
Step-1: a
Step-7: b
Step-8: c
Step-8.1: d
Step-8.1.1: e
Step-8.2: f
Step-9: g
.Step-1: a
Step-1.1: b
Step-2: c
EStep-1: a
Step-7: b
Step-8: c
Step-8.1: d
Step-8.2: d
Step-8.3: d
Step-8.4: d
Step-8.5: d
Step-8.6: f
Step-9: g
.Step-1: a
Step-7: b
Step-8: c
Step-8.3: d
Step-8.3: d
Step-8.3: d
Step-8.3: d
Step-8.3: d
Step-8.4: f
Step-9: g
.
注意:在循环中如果使用step,且未指定编号,则日志编号会随循环不断增加,如testccc所示。
如果希望自动避免,也可以保存一个打印过的日志对应的代码行的表进行判断:如果该行日志已打印,则编号不增加,或仍采用原编号。
不过这个方案还不如用户在循环中指定编号。