unittest 的 testxxx() 本身是不推荐使用函数参数的,然而实际使用时,是不太可能将数据写死,每条用例数据都写一个 testxxx() 方法,所以需要借助配置文件例如excel,然而,又是如何将同一个方法,进行多次测试,并且用到不同的数据,还生成测试报告呢?
如下,提供一种解决方案
1、用xlrd读取excel数据
import xlrd
def ReadExcel(sheetName,rowNum,colNum):
excel = xlrd.open_workbook('C:\\Users\admin\\Desktop\\TestData.xlsx')
sheet = excel.sheet_by_name(sheetName)
data = sheet.cell_value(rowNum-1,colNum-1)
return data
2、用 @classmethod 装饰 setUp(),使 self.n 递增
3、注意要点:
(0)Excel数据至少包含用例数据、预期结果
(1)在 TestCase 子类之外,定义一个返回值为 True、False的函数 func(…)
(2)在 TestCase 子类中,定义的测试方法,用 assert func(…) 来处理
(3)for循环用同一个方法构建测试集
for i in range(5):
suite.addTest(unittest.makeSuite(类名,"方法开头字符串"))
def myCal(a,b,c,result): # 这个函数不能写在下边的类里边
mul = a*b
r = mul + c
print a,'*',b,'+',c ,'==',result
return r == result
#coding=utf-8
import unittest
from unittest import TestSuite
from HTMLTestRunner import HTMLTestRunner
import xlrd
class getExcelData(unittest.TestCase):
@classmethod
def setUpClass(self):
self.n = 1
@classmethod # 一般setUp()不需要,这里是为了self.n递增
def setUp(self):
self.n = self.n + 1
print "n = ",self.n
def aaa(self):
a = readExcel("testOne",self.n,2)
b = readExcel("testOne",self.n,3)
c = readExcel("testOne",self.n,4)
result = readExcel("testOne",self.n,5)
assert myCal(a,b,c,result)
if __name__ == "__main__":
suite = TestSuite()
for i in range(5):
print 'i = ',i
suite.addTest(unittest.makeSuite(getExcelData,'aaa'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
fp = file("./excelResult.html",'wb')
runner = HTMLTestRunner(fp,title="Calculation Result")
runner.run(suite)
fp.close()