WEB自动化测试培训课件_第1页
WEB自动化测试培训课件_第2页
WEB自动化测试培训课件_第3页
WEB自动化测试培训课件_第4页
WEB自动化测试培训课件_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/WEB自动化测试培训32016/06/03课程讲师肖能尤课程目的熟悉和掌握Unittest单元测试框架课程内容Unittest单元测试框架介绍unittest是python的单元测试框架,在python的官方文档中,对unittest有详细的介绍,想更深一步研究的同学可以到去了解,当然,我这里也会接介绍的。unittest单元测试提供了创立测试用例,测试套件以及批量执行的方案,unittest在安装pyhton以后就直接自带了,直接importunittest就可以使用。作为单元测试的框架,unittest也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,我们虽然不需要做白盒测试,但是必须需要知道所使用语言的单元测试框架,这是因为把selenium2的API全部学习完后,就会遇到用例的组织问题,虽然函数式编程和面向对象编程提供了对代码的重构,但是对于所编写的每个测试用例,总不能编写成一个函数(方法)来调用执行吧?很显然,这是不明智的作法。利用单元测试框架,创立一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,到时候直接执行,同时引入测试报告(这是一直所期望的),对于unittest局部,下面详细的依次介绍。unittest各组件的关系为:unittest模块实战unittest支持测试的自动化处理,也同时包含测试的初始化和结束测试,以及把测试用例按模块化封装成一个测试套件,来进行批量的处理。在一个模块化的测试用例中,包含共同的代码,如公司教务网的登录的测试用例,都得先翻开浏览器访问工程地址,执行测试用例完成后,关闭浏览器结束测试,一般开始使用“setUp〞表示,结束使用“tearDown〞,setUp和tearDown被称为测试固件。在测试执行的时候,setUp首先被执行,而且仅会执行一次,这个方法执行通过后,不管后面的测试是否通过,都会执行tearDown来结束测试。在unittest中,提供了TestRunner来为运行测试,该类对象提供了run方法,其中接受TestCase或者TestSuite参数,并且返回测试结果,一般经常使用的是TextTestRunner运行器,可以看成是测试容器。下面写以教务网的登陆例子来验证登陆这个用例是否登陆成功来说明备注:切记在unittest中,测试用例必须以test开头。实现的代码:代码:#-*-coding:utf-8-*-fromseleniumimportwebdriverfromselenium.webdriver.support.uiimportSelectimportunittest,time,reclassLogin(unittest.TestCase):defsetUp(self):self.driver=webdriver.Firefox()self.driver.implicitly_wait(30)self.base_url=""deftest_login(self):'''checkloginsuccessorfail'''driver=self.driverdriver.get(self.base_url)driver.find_element_by_id("txtUserName").clear()driver.find_element_by_id("txtUserName").send_keys("")driver.find_element_by_id("txtPassword").clear()driver.find_element_by_id("txtPassword").send_keys("123123")time.sleep(2)driver.find_element_by_link_text(u"登录").click()time.sleep(1)deftearDown(self):self.driver.quit()if__name__=="__main__":unittest.main(verbosity=2)运行结果:脚本讲解:我们来详细的介绍下如上的代码和输出结果,导入了unittest,创立了测试的类(测试模块名称),继承TestCase,在测试固件中分别写的测试时候的初始化和测试结束后资源释放的代码,中间test_login是测试用例,也就是自动化的测试用例,在主函数中,直接调用main(),在main中参加verbosity=2,这样测试的结果就会显示的更加详细。这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值0(静默模式):你只能获得总的测试用例数和总的结果比方总共100个失败20成功801(默认模式):非常类似静默模式只是在每个成功的用例前面有个“.〞每个失败的用例前面有个“F〞2(详细模式):测试结果会显示每个测试用例的所有相关的信息在编写的每个case中,可以加注释,这样在测试结果中,我们就知道该case是测试那个功能的,如上的截图,依据测试结果,我们就知道第一个testcase是测试登陆的。构建测试套件在1.1介绍测试模块的时候,借助unittest测试框架编写了一个简单的case,在节中,来介绍怎么构建测试套件,测试套件顾名思义就是测试用例的容器。在说明测试套件的时候,以老师平板的工程为案例,来说明测试套件在工程中的实际应用。新建testCase的package,在package中创立test_a1_login登陆模块和test_a10_safe_custody平安监护模块等,见目录结构test_a10_safe_custody模块代码:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCase#平安监护classSafe_custody(AppTestCase):deftest_a1_Safe_custody(self):'''首页-》平安监护'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitdeftest_a2_Safe_custody_bottom(self):'''点击平安监护->讲台->底部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitdeftest_a3_Safe_custody_top(self):'''点击平安监护->讲台->底部->顶部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_obverse").click()self.waitif__name__=='__main__':unittest.main(verbosity=2)###构造测试集#suite=unittest.TestSuite()#suite.addTest(Safe_custody("test_a3_Safe_custody_top"))###执行测试#runner=unittest.TextTestRunner()#runner.run(suite)1.2.1addTest的应用当有多个或者几百测试用例的时候,这样就需要一个测试容器(测试套件),把测试用例放在该容器中进行执行,unittest模块中提供了TestSuite类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例参加到测试套件中。在weke模块中编写了测试使用到的方法,下来我们test_a10_safe_custody模块中编写几个测试用例,以实例的方式来说明addTest的应用,见wekeTest模块中的代码和执行结果截图:代码:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCase#平安监护classSafe_custody(AppTestCase):deftest_a1_Safe_custody(self):'''首页-》平安监护'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitdeftest_a2_Safe_custody_bottom(self):'''点击平安监护->讲台->底部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitdeftest_a3_Safe_custody_top(self):'''点击平安监护->讲台->底部->顶部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_obverse").click()self.waitif__name__=='__main__':#构造测试集suite=unittest.TestSuite()suite.addTest(Safe_custody("test_a1_Safe_custody"))suite.addTest(Safe_custody("test_a2_Safe_custody_bottom"))suite.addTest(Safe_custody("test_a3_Safe_custody_top"))#执行测试runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)运行结果:依据执行结果的截图,可以很清楚的看到,先执行test_a1,至到test_a3,这是由如下代码决定的:suite=unittest.TestSuite()suite.addTest(Safe_custody("test_a1_Safe_custody"))suite.addTest(Safe_custody("test_a2_Safe_custody_bottom"))suite.addTest(Safe_custody("test_a3_Safe_custody_top"))suite是测试套件的实例,调用addTest()方法添加需要执行的case,顺序可以依次来,或者按自己的想法来,添加case到测试套件后,调用unittest模块中TextTestRunner类的run()方法,传入参数为测试套件的实例suite。使用addTest方法,可以实现把测试的case添加到测试套件suite中,但是我个人不建议使用addTest()方法,理由很简单,如果测试case很多,都得需要添加,感觉是重复造轮子。1.2.2makeSuite()在介绍addTest()方法的时候,就说到了它的缺点,重复造轮子并不是想要的,但是代码还是得一步一步的重构。在unittest框架中提供了makeSuite()的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite,unittest调用makeSuite的时候,只需要把测试类名称传入即可。把上面的代码使用makeSuite重构后为:代码重构:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCase#平安监护classSafe_custody(AppTestCase):deftest_a1_Safe_custody(self):'''首页-》平安监护'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitdeftest_a2_Safe_custody_bottom(self):'''点击平安监护->讲台->底部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitdeftest_a3_Safe_custody_top(self):'''点击平安监护->讲台->底部->顶部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_obverse").click()self.waitif__name__=='__main__':#构造测试集suite=unittest.TestSuite(unittest.makeSuite(Safe_custody))#执行测试runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)运行结果:利用makeSuite方法,就不需要担忧有多少个case了,只需要把测试的类传入即可。1.2.3TestLoader()TestLoader用于创立类和模块的测试套件,一般的情况下,使用TestLoader().loadTestsFromTestCase(TestClass)来加载测试类。实现的代码:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCase#平安监护classSafe_custody(AppTestCase):deftest_a1_Safe_custody(self):'''首页-》平安监护'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitdeftest_a2_Safe_custody_bottom(self):'''点击平安监护->讲台->底部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitdeftest_a3_Safe_custody_top(self):'''点击平安监护->讲台->底部->顶部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_obverse").click()self.waitif__name__=='__main__':#构造测试集#suite=unittest.TestSuite(unittest.makeSuite(Safe_custody))suite=unittest.TestLoader().loadTestsFromTestCase(Safe_custody)#执行测试runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)实现结果:1.2.4discover()discover是通过递归的方式到其子目录中从指定的目录开始,找到所有测试模块并返回一个包含它们对象的TestSuite,然后进行加载与模式匹配唯一的测试文件,discover参数分别为discover(dir,pattern,top_level_dir=None)。修改下之前的模块,把测试脚本的模块放在TestCase的模块下,把被调用测试的文件放在Page的模块下,见调整后的目录截图:截图显示为调整后的目录结构,分别讲一个测试用例和run_teacherspad_test。的实现源码。test_a10_safe_custody模块的代码:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByfrommon.touch_actionimportTouchActionimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCaseclasstask_online(AppTestCase):#今日任务-上课deftest_a1_attend_class1(self):'''点击上课'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_study_bt').click()self.wait#今日任务-作业待改deftest_a2_job_to_be_changed(self):'''今日任务->"作业待改'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_dowork_bt').click()self.wait#今日任务-在线答疑deftest_a3_task_online(self):'''点击在线答疑'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.wait#今日任务-在线答疑-查看全部deftest_a4_task_onlineAll(self):'''点击在线答疑-查看全部'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//com.uet.teacherspad.view.hlistview.widget.HListView[contains(@resource-id,'com.uet.teacherspad:id/lv_content')]/android.widget.RelativeLayout[1]").click()self.wait#今日任务-在线答疑-查看第一个学生的所有在线答疑deftest_a5_task_online_OneStu(self):'''点击在线答疑-查看第一个学生的所有在线答疑'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//com.uet.teacherspad.view.hlistview.widget.HListView[contains(@resource-id,'com.uet.teacherspad:id/lv_content')]/android.widget.RelativeLayout[2]").click()self.wait#今日任务-在线答疑-查看第一个(最新)提问详情deftest_a6_task_online_firstQuestion(self):'''点击在线答疑-查看第一个提问详情(列表中最新的问题)'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_left_list')]/android.widget.LinearLayout[1]").click()self.wait#今日任务-在线答疑-答复第一个(最新)提问deftest_a7_task_online_firstQuestion_reply1(self):'''点击在线答疑-使用文字答复第一个提问(列表中最新的问题)'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_left_list')]/android.widget.LinearLayout[1]").click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/edtTxt_content').send_keys(u'你好')self.driver.find_element(By.ID,'com.uet.teacherspad:id/tv_send').click()self.wait#今日任务-在线答疑-答复第一个(最新)提问deftest_a8_task_online_firstQuestion_reply2(self):'''点击在线答疑-使用音频答复第一个提问(列表中最新的问题)'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_left_list')]/android.widget.LinearLayout[1]").click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/iv_record').click()self.waittouch=TouchAction(self.driver)self.waittouch.long_press(self.driver.find_element(By.ID,'com.uet.teacherspad:id/btn_pin'),5).perform()#今日任务-在线答疑-公开第一个在线答疑deftest_a9_task_online_firstQuestion_isPublic(self):'''点击在线答疑-公开第一个提问(列表中最新的问题)'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_left_list')]/android.widget.LinearLayout[1]").click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/rdo_isPublic').click()self.wait#今日任务-在线答疑-不公开第一个在线答疑deftest_a10_task_online_firstQuestion_isNotPublic(self):'''点击在线答疑-不公开第一个提问(列表中最新的问题)'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_left_list')]/android.widget.LinearLayout[1]").click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/rdo_isNotPublic').click()self.wait#今日任务-在线答疑-第一个在线答疑-推荐课程deftest_a12_task_online_firstQuestion_courses(self):'''点击在线答疑-第一个提问(列表中最新的问题)-推荐课程'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_left_list')]/android.widget.LinearLayout[2]").click()self.waitself.driver.find_element(By.XPATH,"//android.widget.ListView[contains(@resource-id,'com.uet.teacherspad:id/lv_right_chat_list')]/android.widget.LinearLayout[1]/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.TextView[contains(@resource-id,'com.uet.teacherspad:id/tv_rec_courses')]").click()self.wait#今日任务-在线答疑-搜索deftest_a13_task_online_search(self):'''点击在线答疑-搜索'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/linear_search').click()self.wait#今日任务-在线答疑-搜索(班级)deftest_a14_task_online_search1(self):'''点击在线答疑-搜索-按班级搜索(三(1)班)'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/linear_search').click()self.waitself.driver.find_element(By.XPATH,"//com.uet.teacherspad.view.hlistview.widget.HListView[contains(@resource-id,'com.uet.teacherspad:id/lv_content')]/android.widget.LinearLayout[2]").click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/search_btn').click()self.wait#今日任务-在线答疑-搜索(发起人)deftest_a15_task_online_search2(self):'''点击在线答疑-搜索-按发起人搜索'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/linear_search').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/editClassTitle1').send_keys('01')self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/search_btn').click()self.wait#今日任务-在线答疑-搜索(日期)deftest_a16_task_online_search3(self):'''点击在线答疑-搜索-按日期搜索'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/linear_search').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/editClassTitle2').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/btnDateOk').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/search_btn').click()self.wait#今日任务-在线答疑-搜索(结合搜索:班级、发起人、日期)deftest_a17_task_online_search4(self):'''点击在线答疑-搜索-按班级、发起人、日期搜索'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/linear_search').click()self.waitself.driver.find_element(By.XPATH,"//com.uet.teacherspad.view.hlistview.widget.HListView[contains(@resource-id,'com.uet.teacherspad:id/lv_content')]/android.widget.LinearLayout[2]").click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/editClassTitle1').send_keys('01')self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/editClassTitle2').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/btnDateOk').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/search_btn').click()self.wait#今日任务-在线答疑-退出deftest_a18_task_online_search_return(self):'''点击在线答疑-搜索-退出在线答疑界面返回老师平板主界面'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_online_bt').click()self.waitself.driver.find_element(By.ID,'com.uet.teacherspad:id/linear_back').click()self.wait#今日任务-申诉deftest_task_appeal(self):'''点击申诉'''self.driver.find_element(By.ID,'com.uet.teacherspad:id/uet_main_add_bt').click()self.wait#执行所有用例if__name__=='__main__':unittest.main(verbosity=2)把测试执行的代码写在allTests的模块,该模块的源码为:#!/usr/bin/envpython#coding:utf-8importHTMLTestRunnerimportunittestimporttimeimportos,sysreload(sys)sys.setdefaultencoding('utf-8')#定义测试用例的目录为当前目录的testcase目录test_dir='./teacherspad/testCase'discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')if__name__=='__main__':now_time=time.strftime("%Y-%m-%d%H_%M_%S")fp=open("./teacherspad/report/"+now_time+'.html',"wb")runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'老师平板测试报告',description=u'用例执行情况:')#runner=unittest.TextTestRunner()runner.run(discover)fp.close()注释:对如上的代码进行解释,discover=unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')是对discover的应用,第一个参数是放testcase的目录,第二个是使用了正则表达式,匹配目录下所有的测试模块,第三个参数默认为None执行测试在unittest的模块中,提供了TestRunner类来进行运行测试用例,在实际的应用中,经常使用的是TextTestRunner类,执行后,会已文字的形式打印出测试结果,见测试代码和执行结果截图:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCase#平安监护classSafe_custody(AppTestCase):deftest_a1_Safe_custody(self):'''首页-》平安监护'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitdeftest_a2_Safe_custody_bottom(self):'''点击平安监护->讲台->底部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitdeftest_a3_Safe_custody_top(self):'''点击平安监护->讲台->底部->顶部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_obverse").click()self.waitif__name__=='__main__':#构造测试集suite=unittest.TestSuite()suite.addTest(Safe_custody("test_a1_Safe_custody"))suite.addTest(Safe_custody("test_a2_Safe_custody_bottom"))suite.addTest(Safe_custody("test_a3_Safe_custody_top"))#执行测试runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)实现结果:在截图中,可以看到这些后详细的结果,四个字可以总结,一目了然。1.3.1用例的执行顺序unittest框架默认加载测试用例的顺序是根据ASCII码的顺序,数字与字母的顺序为:0~9,A~Z,a~z。所以,TestAdd类会优先于TestBdd类被发现,test_aaa()方法会优先于test_ccc()被执行。虽然,它们从上到下的顺序都是点到。对于测试目录与测试文件来说,unittest框架同样是按照这个规则来加载测试用例。1.3.2unittest.skip()unittest.skip('注释')是忽略此测试,最好写忽略该case的原因,如在一个自动化的测试模块中,由于某些功能取消,那么对应的case也就不再执行,可以添加unittest.skip(),这样,执行的时候,就不会在执行该case,执行后,执行结果会告诉用户哪些case是属于忽略执行的,如案例中的,忽略执行test_a2_Safe_custody_bottom的case,其他的case正常执行。代码实现:#coding:utf-8fromappiumimportwebdriverfromseleniumimportwebdriverfromtimeimportsleepfrommon.byimportByimportunittest,syssys.path.append('./page')frompage.baseTestCaseimportAppTestCase#平安监护classSafe_custody(AppTestCase):deftest_a1_Safe_custody(self):'''首页-》平安监护'''self.driver.find_element(By.NAME,u'平安监护').click()self.wait@unittest.skip(u'Thefunctionwascanceled,neglectstoperformthecase')deftest_a2_Safe_custody_bottom(self):'''点击平安监护->讲台->底部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitdeftest_a3_Safe_custody_top(self):'''点击平安监护->讲台->底部->顶部'''self.driver.find_element(By.NAME,u'平安监护').click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_reverse").click()self.waitself.driver.find_element(By.ID,"com.uet.teacherspad:id/rdobtn_obverse").click()self.waitif__name__=='__main__':#构造测试集suite=unittest.TestLoader().loadTestsFromTestCase(Safe_custody)#执行测试runner=unittest.TextTestRunner(verbosity=2)runner.run(suite)执行结果:unittest的断言自动化的测试中,对于每个单独的case来说,一个case的执行结果中,必然会有期望结果与实际结果,来判断该case是通过还是失败,在unittest的库中提供了大量的实用方法来检查预期值与实际值,来验证case的结果,一般来说,检查条件大体分为等价性,逻辑比较以及其他,如果给定的断言通过,测试会继续执行到下一行的代码,如果断言失败,对应的case测试会立即停止或者生成错误信息(一般打印错误信息即可),但是不要影响其他的case执行。

unittest的单元测试库提供了标准的xUnit断言方法,一以下出了经常使用到的(详细信息见官方的unittest库资料):1、assertEqual(a,b)来验证a是不是等价于b,如果比较值不相等,就会失败,下面已测试案例来验证下,测试教务网的登陆,设计了多种登陆情况的用例验证,来引用assertEqual(),见测试脚本和截图:代码实现:#coding:utf-8fromtimeimportsleepimportunittest,random,syssys.path.append("./models")sys.path.append("./page_obj")frommodelsimportmyunitfrompage_obj.loginPageimportloginclassloginTest(myunit.MyTest): '''登录测试''' #测试用户登录 defuser_login_verify(self,username="",password=""): login(self.driver).user_login(username,password)# deftest_login1(self):# '''用户名、密码为空登录'''# self.user_login_verify()# po=login(self.driver)# self.assertEqual(po.user_error_hint(),"账号不能为空")# self.assertEqual(po.pawd_error_hint(),"密码不能为空") deftest_login2(self): '''用户不存在''' self.user_login_verify(username="",password='123123') po=login(self.driver) self.assertEqual(po.user_error_hint(),u"用户不存在") deftest_login3(self): '''密码输入错误!''' self.user_login_verify(username="",password="123456") po=login(self.driver) self.assertEqual(po.pawd_error_hint(),u"密码输入错误")## deftest_login4(self): '''用户名、密码正确''' self.user_login_verify(username="",password="123123") sleep(2) po=login(self.driver) self.assertEqual(po.user_login_success(),'') if__name__=="__main__": unittest.main()执行结果:2、assertTrue()是bool值的比较,期望结果是true,来看assertTrue方法的使用,见测试代码和执行结果的结果:importunittestimpor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论