每天进步一点点,关注我们哦,每天分享测试技术文章 码同学公众号:自动化软件测试 码同学抖音号:小码哥聊软件测试 Python2。1及以后的版本,将unittest作为一个标准模块放入Python开发包中。 01使用unittest编写测试用例 规则:importunittest创建一个测试类,必须要继承unittest。TestCase类创建一个测试方法,且方法要以test开头fromcalculatorimportCalculatorimportunittestclassTestAdd(unittest。TestCase):deftestadd(self):cCalculator(3,5)resultc。add()self。assertEqual(result,8)ifnamemain:unittest。main()通过main()方法来执行测试用例;按照测试类、方法的名称ASCII值大小的顺序执行用例 unittest的执行结果:。表示测试用例执行通过F表示执行失败E表示执行错误s表示运行跳过 02三个重要概念 TestCase最小的测试单元,即测试方法。unittest提供了TestCase基类,我们创建的测试类要继承该基类,它可以用来创建新的测试用例。 TestSuite测试用例、测试套件或两者的集合,用于组装一组要运行的测试。 使用TestSuite类来创建测试套件。 TestRunnerTestRunner是一个组件,用于协调测试的执行并向用户提供结果。unittest提供了TextTestRunner类运行测试用例。 03测试用例执行顺序 unittest默认按照ASCII码的顺序加载测试用例(包括测试目录和测试文件、测试类、测试方法),即它并不是按照测试用例的创建顺序从上到下执行的。 discover()和main()方法的执行顺序是一样的。故想让某个测试文件先执行,可以在命名上加以控制。 如何控制测试用例的执行顺序?可以通过TestSuite类的addTest()方法按照一定的顺序来加载测试用例,这样想先被执行的用例就可以先加载。fromcalculatorimportCalculatorimportunittestclassTestAdd(unittest。TestCase):deftestadd(self):cCalculator(3,5)resultc。add()self。assertEqual(result,8)deftestadddecimals(self):cCalculator(3。5,5。5)resultc。add()self。assertEqual(result,9)classTestSub(unittest。TestCase):deftestsub(self):cCalculator(5,1)resultc。sub()self。assertEqual(result,4)ifnamemain:创建测试套件suitunittest。TestSuite()suit。addTest(TestSub(testsub))添加测试用例suit。addTest(TestAdd(testadddecimals))创建测试运行器runnerunittest。TextTestRunner()runner。run(suit) 04执行多个测试用例 unittest。defaultTestLoader。discover()方法可以从多个文件中查找测试用例。 该类根据各种标准加载测试用例,并将它们返回给测试套件 discover(startdir,patternTest。py,topleveldirNone)startdir:待测试的模块名测试用例目录;discover()方法会自动根据这个参数查找测试用例文件pattern:测试用例文件名的匹配原则topleveldir:测试模块的顶级目录,如果没有顶级目录,默认为NoneimportunittesttestdirTest文件目录suitsunittest。defaultTestLoader。discover(testdir,patternTest。py)ifnamemain:runnerunittest。TextTestRunner()runner。run(suits) 如果想让discover()查找子目录下的测试文件,得将子目录标记为一个python模块(子目录下放init。py文件) 05跳过测试和预期失败 importunittestclassMyTest(unittest。TestCase):unittest。skip(跳过这条用例)deftestskip(self):print(aaa)unittest。skipIf(32,当条件为真时跳过测试)deftestskipif(self):print(bbb)unittest。skipUnless(32,当条件为假时跳过测试)deftestskipunless(self):print(ccc)不论执行结果是什么,都将测试标记为失败unittest。expectedFailuredeftestfail(self):print(ddd)ifnamemain:unittest。main() 执行结果:E:seleniumD:ProgramFilesPython39python。exee:seleniumTestunittestskipfail。pydddussccc。Ran4testsin0。001sFAILED(skipped2,unexpectedsuccesses1) 以上四个装饰器同样适用于测试类。 06Setup和Teardown setUpModuletearDownModule在整个模块的开始与结束时被执行setUpClasstearDownClass在测试类的开始与结束时被执行setUptearDown在测试用例的开始与结束时被执行importunittestdefsetUpModule():print(Modulestart。。。。。)deftearDownModule():print(Moduleend。。。)classMyTest(unittest。TestCase):classmethoddefsetUpClass(cls):print(ClassStart。。。)classmethoddeftearDownClass(cls):print(Classend。。。)defsetUp(self):print(testcasestart。。。)deftearDown(self):print(testcaseend。。。)deftestcase1(self):print(thisisfirsttestcase)deftestcase2(self):print(thisissecondtestcase)ifnamemain:unittest。main() 执行结果如下:E:seleniumD:ProgramFilesPython39python。exee:seleniumTestunittestsetup。pyModulestart。。。。。ClassStart。。。testcasestart。。。thisisfirsttestcasetestcaseend。。。。testcasestart。。。thisissecondtestcasetestcaseend。。。。Classend。。。Moduleend。。。Ran2testsin0。002sOK 免费领取码同学软件测试课程笔记超多学习资料完整视频最新面试题,可以转发文章私信码同学666获取资料哦 07Web自动化测试 importunittestfromseleniumimportwebdriverfromtimeimportsleepclassBaidu(unittest。TestCase):classmethoddefsetUpClass(cls):cls。driverwebdriver。Chrome()cls。driver。implicitlywait(5)cls。driver。get(http:www。baidu。com)cls。driver。maximizewindow()classmethoddeftearDownClass(cls):cls。driver。quit()defsearch(self,text):self。driver。findelementbyid(kw)。clear()self。driver。findelementbyid(kw)。sendkeys(text)self。driver。findelementbyid(su)。click()sleep(3)deftestsearchselenium(self):searchkeyseleniumself。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)deftestsearchpython(self):searchkeypythonself。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)ifnamemain:unittest。main() 08hrParameterized Parameterized是python的一个参数化库,同时支持unittest、pytest单元测试框架。pipinstallparameterizedparameterized。expand()加载数据,列表中每个元组是一条测试用例importunittestfromtimeimportsleepfromseleniumimportwebdriverfromparameterizedimportparameterizedclassTestBaidu(unittest。TestCase):classmethoddefsetUpClass(cls):cls。driverwebdriver。Chrome()cls。driver。get(http:www。baidu。com)cls。driver。maximizewindowclassmethoddeftearDownClass(cls):cls。driver。quit()defsearch(self,searchkey):self。driver。findelementbyid(kw)。clear()self。driver。findelementbyid(kw)。sendkeys(searchkey)self。driver。findelementbyid(su)。click()sleep(5)parameterized。expand(〔(case1,selenium),(case2,python)〕)deftestsearch(self,name,searchkey):self。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)ifnamemain:unittest。main(verbosity2) 09hrDDT DataDrivenTests是针对unittest单元测试框架设计的扩展库。 安装: pipinstallddt 导入: fromddtimportddt,data,filedata,unpack 使用规则:必须用ddt装饰测试类数据有不同形式的参数化,如下方的元组、列表、字典类型data(数据列表元组字典,字典的key和方法中的形参名称保持一致)unpack装饰测试方法importunittestfromtimeimportsleepfromseleniumimportwebdriverfromddtimportddt,data,filedata,unpackddtclassTestBaidu(unittest。TestCase):classmethoddefsetUpClass(cls):cls。driverwebdriver。Chrome()cls。driver。get(http:www。baidu。com)cls。driver。maximizewindowclassmethoddeftearDownClass(cls):cls。driver。quit()defsearch(self,searchkey):self。driver。findelementbyid(kw)。clear()self。driver。findelementbyid(kw)。sendkeys(searchkey)self。driver。findelementbyid(su)。click()sleep(5)data((case1,selenium),(case2,python))unpackdeftestsearch1(self,name,searchkey):print(第一组测试用例:,name)self。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)data(〔case1,selenium〕,〔case2,python〕)unpackdeftestsearch2(self,name,searchkey):print(第二组测试用例:,name)self。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)data({key:selenium},{key:python})unpackdeftestsearch3(self,key):print(第三组测试用例:,key)self。search(key)self。assertEqual(self。driver。title,key百度搜索)ifnamemain:unittest。main(verbosity2) 执行报错如下时,是因为文件名也为ddt:PSE:seleniumD:ProgramFilesPython39python。exee:seleniumTestunittestddt。pyTraceback(mostrecentcalllast):Filee:seleniumTestunittestddt。py,line4,inmodulefromddtimportddt,data,filedata,unpackFilee:seleniumTestunittestddt。py,line4,inmodulefromddtimportddt,data,filedata,unpackImportError:cannotimportnameddtfrompartiallyinitializedmoduleddt(mostlikelyduetoacircularimport)(e:seleniumTestunittestddt。py) 10hr数据文件的参数化 filedata()装饰器中内容为文件名称。支持json格式和yaml格式。importunittestfromtimeimportsleepfromseleniumimportwebdriverfromddtimportddt,data,filedata,unpackddtclassTestBaidu(unittest。TestCase):classmethoddefsetUpClass(cls):cls。driverwebdriver。Chrome()cls。driver。get(http:www。baidu。com)cls。driver。maximizewindowclassmethoddeftearDownClass(cls):cls。driver。quit()defsearch(self,searchkey):self。driver。findelementbyid(kw)。clear()self。driver。findelementbyid(kw)。sendkeys(searchkey)self。driver。findelementbyid(su)。click()sleep(5)filedata(ddtdata。json)unpackdeftestsearch1(self,searchkey):print(第一组测试用例:,searchkey)self。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)filedata(ddtdatayml。yaml)unpackdeftestsearch2(self,case):searchkeycase〔0〕〔searchkey〕print(第二组测试用例:,searchkey)self。search(searchkey)self。assertEqual(self。driver。title,searchkey百度搜索)ifnamemain:unittest。main(verbosity2)ddtdata。json{case1:{searchkey:python},case2:{searchkey:ddt}}ddtdatayml。yamlcase1:searchkey:pythoncase2:searchkey:ddt END 免费领取码同学软件测试课程笔记超多学习资料学习完整视频,可以关注我们公众号哦:自动化软件测试