unit test

unittest中最核心的部分是:TestFixture、TestCase、TestSuite、TestRunner

TestFixture

作用:用于一个测试环境的准备和销毁还原。

setUp():准备环境,执行每个测试用例的前置条件;

tearDown():环境还原,执行每个测试用例的后置条件;

setUpClass():必须使用@classmethod装饰器,所有case执行的前置条件,只运行一次;

tearDownClass():必须使用@classmethod装饰器,所有case运行完后只运行一次;

TestCase:测试用例

importunittestclassCalc_testcase(unittest.TestCase):defsetUp(self):测试用例方法执行前的操作print("start")deftest1(self):测试用例,方法名称必须以test开头        resl=4self.assertEqual(resl,5)deftearDown(self):测试用例方法执行后的操作print("end")if__name__=="__main__":unittest.main()调用测试用例中以test开头的方法,直接输入main

TestSuite:测试套件,可以将多个测试用例集合在一起,能一起执行选中的测试用例

if __name__ == '__main__':    unittest.main    suite = unittest.TestSuite()    caseList = ["test001", "test002"]    for case in caseList:        suite.addTest(UnitTestTwo(case))    运行测试用例    runner = unittest.TextTestRunner(verbosity=2)    runner.run(suite)

TextRunner

执行测试用例

通过TextTestRunner类提供的run()方法来执行test suite/test cas

格式:

runner = unittest.TextTestRunner(verbosity=2)

runner.run(suite)

verbosity :表示测试报告信息的详细程度,一共三个值,默认是2

0 (静默模式):你只能获得总的测试用例数和总的结果,如:总共100个 失败10 成功90

1 (默认模式):类似静默模式,只是在每个成功的用例前面有个. 每个失败的用例前面有个F

2 (详细模式):测试结果会显示每个测试用例的所有相关的信息

断言:

assertEqual(a,b):断言a和b是否相等,相等则测试用例通过。assertNotEqual(a,b):断言a和b是否相等,不相等则测试用例通过。assertTrue(x):断言x是否True,是True则测试用例通过。assertFalse(x):断言x是否False,是False则测试用例通过。assertIs(a,b):断言a是否是b,是则测试用例通过。assertNotIs(a,b):断言a是否是b,不是则测试用例通过。assertIsNone(x):断言x是否None,是None则测试用例通过。assertIsNotNone(x):断言x是否None,不是None则测试用例通过。assertIn(a,b):断言a是否在b中,在b中则测试用例通过。assertNotIn(a,b):断言a是否在b中,不在b中则测试用例通过。assertIsInstance(a,b):断言a是是b的一个实例,是则测试用例通过。assertNotIsInstance(a,b):断言a是是b的一个实例,不是则测试用例通过。

生成测试报告

1:导入unittest模块  >>>import unittest

2:编写一个类继承unittest.TestCase

3:调用setUp(self), tearDown(self)方法实现测试用例前后阶段的操作

4:编写测试用例方法

(1)该方法必须以test开头,否则在unittest.main()中调用测试找不到该方法

(2)设置断言进行判断,输入数据和输出数据的预期结果

5:创建套件,将多个测试用例存放套件中,一并执行()

6:生成测试报告(python自带或者导入HTMLTestRunner生成html格式的测试报告)

7:运行测试用例unittest.main(),调用测试用例中以test开头的方法

读取xml文件

fromxml.domimportminidomclassReadxml():defread_xml(self,path,onename,twoname):root=minidom.parse(path)firstnode=root.getElementsByTagName(onename)[0]secondnode=firstnode.getElementsByTagName(twoname)[0].firstChild.datareturnsecondnoder=Readxml()print(r.read_xml(path,'add','add3'))

具体应用:

importunittestfromdev.CaculateimportCaculatefromreaddata.readxmldataimportReadxmlc=Caculate()r=Readxml()a1=r.read_xml('../data/xmltestdata.xml','add','add1')a2=r.read_xml('../data/xmltestdata.xml','add','add2')a3=r.read_xml('../data/xmltestdata.xml','add','add3')r1=r.read_xml('../data/xmltestdata.xml','reduce','reduce1')r2=r.read_xml('../data/xmltestdata.xml','reduce','reduce2')r3=r.read_xml('../data/xmltestdata.xml','reduce','reduce3')classUnitTestTwo(unittest.TestCase):defsetUp(self)->None:print("开始")deftest001(self):sum=c.add(int(a1),int(a2))self.assertEqual(sum,int(a3))deftest002(self):dif=c.reduce(int(r1),int(r2))self.assertEqual(dif,int(r3))deftearDown(self)->None:print("结束")if__name__=='__main__':unittest.main

读取csv文件

importcsv  导入csv模块classReadCsv():defread_csv(self):item=[]定义一个空列表        c=csv.reader(open(path,"r"))得到csv文件对象forcsv_iinc:item.append(csv_i)将获取的数据添加到列表中returnitem            r=ReadCsv()print(r.read_csv(path))

具体使用:

importunittestfromdev.CaculateimportCaculatefromreaddata.readcsvimportReadCsvc=Caculate()r=ReadCsv()classUnitTestTwo(unittest.TestCase):defsetUp(self)->None:print("开始")deftest001(self):passforiinr.readCsv(path):add=c.add(int(i[0]),int(i[1]))self.assertEqual(add,int(i[2]))deftearDown(self)->None:print("结束")if__name__=='__main__':unittest.main

你可能感兴趣的:(unit test)