![联教测试部[web自动化]培训3_unittest框架_第1页](http://file3.renrendoc.com/fileroot_temp3/2021-12/29/f1782a5e-057d-45a2-9c90-a239d38c704d/f1782a5e-057d-45a2-9c90-a239d38c704d1.gif)
![联教测试部[web自动化]培训3_unittest框架_第2页](http://file3.renrendoc.com/fileroot_temp3/2021-12/29/f1782a5e-057d-45a2-9c90-a239d38c704d/f1782a5e-057d-45a2-9c90-a239d38c704d2.gif)
![联教测试部[web自动化]培训3_unittest框架_第3页](http://file3.renrendoc.com/fileroot_temp3/2021-12/29/f1782a5e-057d-45a2-9c90-a239d38c704d/f1782a5e-057d-45a2-9c90-a239d38c704d3.gif)
![联教测试部[web自动化]培训3_unittest框架_第4页](http://file3.renrendoc.com/fileroot_temp3/2021-12/29/f1782a5e-057d-45a2-9c90-a239d38c704d/f1782a5e-057d-45a2-9c90-a239d38c704d4.gif)
![联教测试部[web自动化]培训3_unittest框架_第5页](http://file3.renrendoc.com/fileroot_temp3/2021-12/29/f1782a5e-057d-45a2-9c90-a239d38c704d/f1782a5e-057d-45a2-9c90-a239d38c704d5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WEB自动化测试培训32016/06/03课程讲师 肖能尤课程目的熟悉和掌握Unittest单元测试框架课程内容1 Unittest单元测试框架介绍unittest是python的单元测试框架, 在python的官方文档中,对unittest有详细的介绍,想更深一步研究的同学可以到/doc/去了解,当然,我这里也会接介绍的。unittest单元测试提供了创建测试用例,测试套件以及批量执行的方案,unittest在安装pyhton以后就直接自带了,直接import unittest就可以使用。作为单元测试的框架,unittest也是可以对程序最小模块的一
2、种敏捷化的测试。在自动化测试中,我们虽然不需要做白盒测试,但是必须需要知道所使用语言的单元测试框架,这是因为把selenium2的API全部学习完后,就会遇到用例的组织问题,虽然函数式编程和面向对象编程提供了对代码的重构,但是对于所编写的每个测试用例,总不能编写成一个函数(方法)来调用执行吧?很显然,这是不明智的作法。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,到时候直接执行,同时引入测试报告(这是一直所期望的),对于unittest部分,下面详细的依次介绍。unittest各组件的关系为: 1.1
3、unittest模块实战unittest支持测试的自动化处理,也同时包含测试的初始化和结束测试,以及把测试用例按模块化封装成一个测试套件,来进行批量的处理。在一个模块化的测试用例中,包含共同的代码,如公司教务网的登录的测试用例,都得先打开浏览器访问项目地址,执行测试用例完成后,关闭浏览器结束测试,一般开始使用“setUp”表示,结束使用“tearDown”,setUp和tearDown被称为测试固件。在测试执行的时候,setUp首先被执行,而且仅会执行一次,这个方法执行通过后,不管后面的测试是否通过,都会执行tearDown来结束测试。在unittest中,提供了TestRunner来为运行测
4、试,该类对象提供了run方法,其中接受TestCase或者TestSuite参数,并且返回测试结果,一般经常使用的是TextTestRunner运行器,可以看成是测试容器。下面写以教务网的登陆例子来验证登陆这个用例是否登陆成功来说明备注:切记在unittest中,测试用例必须以test开头。实现的代码:代码:# -*- coding: utf-8 -*-from selenium import webdriverfrom selenium.webdriver.support.ui import Selectimport unittest, time, reclass Login(unittes
5、t.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.implicitly_wait(30) self.base_url = 80/Uet-Uechn/ def test_login(self): check login success or fail driver = self.driver driver.get(self.base_url) driver.find_element_by_id(txtUserName).clear() driver.find_
6、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) def tearDown(self): self.driver.quit() if _name_ = _main_:unittest.main(
7、verbosity=2)运行结果:脚本讲解:我们来详细的介绍下如上的代码和输出结果,导入了unittest,创建了测试的类(测试模块名称),继承TestCase,在测试固件中分别写的测试时候的初始化和测试结束后资源释放的代码,中间test_login是测试用例,也就是自动化的测试用例,在主函数中,直接调用main(),在main中加入verbosity=2,这样测试的结果就会显示的更加详细。这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功801 (默认模式): 非常类似静默模式 只是
8、在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F”2 (详细模式):测试结果会显示每个测试用例的所有相关的信息在编写的每个case中,可以加注释,这样在测试结果中,我们就知道该case是测试那个功能的,如上的截图,依据测试结果,我们就知道第一个testcase是测试登陆的。1.2 构建测试套件在1.1介绍测试模块的时候,借助unittest测试框架编写了一个简单的case,在节中,来介绍怎么构建测试套件,测试套件顾名思义就是测试用例的容器。 在说明测试套件的时候,以老师平板的项目为案例,来说明测试套件在项目中的实际应用。新建testCase的package,在package中创建t
9、est_a1_login 登陆模块和test_a10_safe_custody 安全监护模块等,见目录结构test_a10_safe_custody模块代码:#coding:utf-8from appium import webdriverfrom selenium import webdriverfrom time import sleepfrom mon.by import Byimport unittest,syssys.path.append(./page)from page.baseTestCase import AppTestCase#安全监护class Safe_custody(
10、AppTestCase): def test_a1_Safe_custody(self): 首页-安全监护 self.driver.find_element(By.NAME,u安全监护).click() self.wait def test_a2_Safe_custody_bottom(self): 点击安全监护-讲台-底部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click()
11、self.wait def test_a3_Safe_custody_top(self): 点击安全监护-讲台-底部-顶部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_obverse).click() self.wait if _
12、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.1 addTest的应用当有多个或者几百测试用例的时候,这样就需要一个测试容器(测试套件),把测试用例放在该容器中进行执行,unittest模块中提供了TestSuite类来生成测试套件,使
13、用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。在weke模块中编写了测试使用到的方法,下来我们test_a10_safe_custody模块中编写几个测试用例,以实例的方式来说明addTest的应用,见wekeTest模块中的代码和执行结果截图:代码:#coding:utf-8from appium import webdriverfrom selenium import webdriverfrom time import sleepfrom mon.by import Byimport unittest,syssys.path.appe
14、nd(./page)from page.baseTestCase import AppTestCase#安全监护class Safe_custody(AppTestCase): def test_a1_Safe_custody(self): 首页-安全监护 self.driver.find_element(By.NAME,u安全监护).click() self.wait def test_a2_Safe_custody_bottom(self): 点击安全监护-讲台-底部 self.driver.find_element(By.NAME,u安全监护).click() self.wait sel
15、f.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click() self.wait def test_a3_Safe_custody_top(self): 点击安全监护-讲台-底部-顶部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click() self.wait self.driver.find_
16、element(By.ID,com.uet.teacherspad:id/rdobtn_obverse).click() self.wait if _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 = u
17、nittest.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)sui
18、te是测试套件的实例,调用addTest()方法添加需要执行的case,顺序可以依次来,或者按自己的想法来,添加case到测试套件后,调用unittest模块中TextTestRunner类的run()方法,传入参数为测试套件的实例suite。使用addTest方法,可以实现把测试的case添加到测试套件suite中,但是我个人不建议使用addTest()方法,理由很简单,如果测试case很多,都得需要添加,感觉是重复造轮子。1.2.2 makeSuite()在介绍addTest()方法的时候,就说到了它的缺点,重复造轮子并不是想要的,但是代码还是得一步一步的重构。在unittest框架中提供
19、了makeSuite()的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite,unittest调用makeSuite的时候,只需要把测试类名称传入即可。把上面的代码使用makeSuite重构后为:代码重构:#coding:utf-8from appium import webdriverfrom selenium import webdriverfrom time import sleepfrom mon.by import Byimport unittest,syssys.path.append(./page)from page.baseTest
20、Case import AppTestCase#安全监护class Safe_custody(AppTestCase): def test_a1_Safe_custody(self): 首页-安全监护 self.driver.find_element(By.NAME,u安全监护).click() self.wait def test_a2_Safe_custody_bottom(self): 点击安全监护-讲台-底部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,
21、com.uet.teacherspad:id/rdobtn_reverse).click() self.wait def test_a3_Safe_custody_top(self): 点击安全监护-讲台-底部-顶部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click() self.wait self.driver.find_element(By.ID,com.uet.teache
22、rspad:id/rdobtn_obverse).click() self.wait if _name_=_main_: #构造测试集 suite=unittest.TestSuite(unittest.makeSuite(Safe_custody) # 执行测试 runner = unittest.TextTestRunner(verbosity=2) runner.run(suite) 运行结果:利用makeSuite方法,就不需要担心有多少个case了,只需要把测试的类传入即可。1.2.3 TestLoader()TestLoader用于创建类和模块的测试套件,一般的情况下,使用Test
23、Loader().loadTestsFromTestCase(TestClass)来加载测试类。实现的代码:#coding:utf-8from appium import webdriverfrom selenium import webdriverfrom time import sleepfrom mon.by import Byimport unittest,syssys.path.append(./page)from page.baseTestCase import AppTestCase#安全监护class Safe_custody(AppTestCase): def test_a1
24、_Safe_custody(self): 首页-安全监护 self.driver.find_element(By.NAME,u安全监护).click() self.wait def test_a2_Safe_custody_bottom(self): 点击安全监护-讲台-底部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click() self.wait def test_a3_Saf
25、e_custody_top(self): 点击安全监护-讲台-底部-顶部 self.driver.find_element(By.NAME,u安全监护).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_reverse).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdobtn_obverse).click() self.wait if _name_=_main_: #构造测试集# sui
26、te=unittest.TestSuite(unittest.makeSuite(Safe_custody) suite=unittest.TestLoader().loadTestsFromTestCase(Safe_custody) # 执行测试 runner = unittest.TextTestRunner(verbosity=2) runner.run(suite) 实现结果:1.2.4 discover()discover是通过递归的方式到其子目录中从指定的目录开始,找到所有测试模块并返回一个包含它们对象的TestSuite,然后进行加载与模式匹配唯一的测试文件,discover参
27、数分别为discover(dir,pattern,top_level_dir=None)。修改下之前的模块,把测试脚本的模块放在TestCase的模块下,把被调用测试的文件放在Page的模块下,见调整后的目录截图:截图显示为调整后的目录结构,分别讲一个测试用例和run_teacherspad_test。的实现源码。test_a10_safe_custody模块的代码:#coding:utf-8from appium import webdriverfrom selenium import webdriverfrom time import sleepfrom mon.by import Byf
28、rom mon.touch_action import TouchActionimport unittest,syssys.path.append(./page)from page.baseTestCase import AppTestCaseclass task_online(AppTestCase): #今日任务-上课 def test_a1_attend_class1(self): 点击上课 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_study_bt).click() self.wait #今日任务-作业
29、待改 def test_a2_job_to_be_changed(self): 今日任务-作业待改 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_dowork_bt).click() self.wait #今日任务-在线答疑 def test_a3_task_online(self): 点击在线答疑 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait #今日任务-在线答疑-查看全部 d
30、ef test_a4_task_onlineAll(self): 点击在线答疑-查看全部 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XPATH,/com.uet.teacherspad.view.hlistview.widget.HListViewcontains(resource-id,com.uet.teacherspad:id/lv_content)/android.widget.Relati
31、veLayout1).click() self.wait#今日任务-在线答疑-查看第一个学生的所有在线答疑 def test_a5_task_online_OneStu(self): 点击在线答疑-查看第一个学生的所有在线答疑 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XPATH,/com.uet.teacherspad.view.hlistview.widget.HListViewcontains
32、(resource-id,com.uet.teacherspad:id/lv_content)/android.widget.RelativeLayout2).click() self.wait#今日任务-在线答疑-查看第一个(最新)提问详情 def test_a6_task_online_firstQuestion(self): 点击在线答疑-查看第一个提问详情(列表中最新的问题) self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.fi
33、nd_element(By.XPATH,/android.widget.ListViewcontains(resource-id,com.uet.teacherspad:id/lv_left_list)/android.widget.LinearLayout1).click() self.wait#今日任务-在线答疑-答复第一个(最新)提问 def test_a7_task_online_firstQuestion_reply1(self): 点击在线答疑-使用文字答复第一个提问(列表中最新的问题) self.driver.find_element(By.ID,com.uet.teachers
34、pad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XPATH,/android.widget.ListViewcontains(resource-id,com.uet.teacherspad:id/lv_left_list)/android.widget.LinearLayout1).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/edtTxt_content).send_keys(u你好) self.d
35、river.find_element(By.ID,com.uet.teacherspad:id/tv_send).click() self.wait#今日任务-在线答疑-答复第一个(最新)提问 def test_a8_task_online_firstQuestion_reply2(self): 点击在线答疑-使用音频答复第一个提问(列表中最新的问题) self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XP
36、ATH,/android.widget.ListViewcontains(resource-id,com.uet.teacherspad:id/lv_left_list)/android.widget.LinearLayout1).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/iv_record).click() self.wait touch=TouchAction(self.driver) self.wait touch.long_press(self.driver.find_element(
37、By.ID,com.uet.teacherspad:id/btn_pin),5).perform() #今日任务-在线答疑-公开第一个在线答疑 def test_a9_task_online_firstQuestion_isPublic(self): 点击在线答疑-公开第一个提问(列表中最新的问题) self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XPATH,/android.widget.ListVie
38、wcontains(resource-id,com.uet.teacherspad:id/lv_left_list)/android.widget.LinearLayout1).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/rdo_isPublic).click() self.wait#今日任务-在线答疑-不公开第一个在线答疑 def test_a10_task_online_firstQuestion_isNotPublic(self): 点击在线答疑-不公开第一个提问(列表中最新的问题) se
39、lf.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XPATH,/android.widget.ListViewcontains(resource-id,com.uet.teacherspad:id/lv_left_list)/android.widget.LinearLayout1).click() self.wait self.driver.find_element(By.ID,com.uet.teacher
40、spad:id/rdo_isNotPublic).click() self.wait#今日任务-在线答疑-第一个在线答疑-推荐课程 def test_a12_task_online_firstQuestion_courses(self): 点击在线答疑-第一个提问(列表中最新的问题)-推荐课程 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.XPATH,/android.widget.ListViewco
41、ntains(resource-id,com.uet.teacherspad:id/lv_left_list)/android.widget.LinearLayout2).click() self.wait self.driver.find_element(By.XPATH,/android.widget.ListViewcontains(resource-id,com.uet.teacherspad:id/lv_right_chat_list)/android.widget.LinearLayout1/android.widget.RelativeLayout/android.widget.
42、RelativeLayout/android.widget.TextViewcontains(resource-id,com.uet.teacherspad:id/tv_rec_courses).click() self.wait#今日任务-在线答疑-搜索 def test_a13_task_online_search(self): 点击在线答疑-搜索 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.ID
43、,com.uet.teacherspad:id/linear_search).click() self.wait#今日任务-在线答疑-搜索(班级) def test_a14_task_online_search1(self): 点击在线答疑-搜索-按班级搜索(三(1)班) self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/linear_search).cl
44、ick() self.wait self.driver.find_element(By.XPATH,/com.uet.teacherspad.view.hlistview.widget.HListViewcontains(resource-id,com.uet.teacherspad:id/lv_content)/android.widget.LinearLayout2).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/search_btn).click() self.wait#今日任务-在线答疑-
45、搜索(发起人) def test_a15_task_online_search2(self): 点击在线答疑-搜索-按发起人搜索 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/linear_search).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/ed
46、itClassTitle1).send_keys(01) self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/search_btn).click() self.wait#今日任务-在线答疑-搜索(日期) def test_a16_task_online_search3(self): 点击在线答疑-搜索-按日期搜索 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.
47、find_element(By.ID,com.uet.teacherspad:id/linear_search).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/editClassTitle2).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/btnDateOk).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id
48、/search_btn).click() self.wait#今日任务-在线答疑-搜索(结合搜索:班级、发起人、日期) def test_a17_task_online_search4(self): 点击在线答疑-搜索-按班级、发起人、日期搜索 self.driver.find_element(By.ID,com.uet.teacherspad:id/uet_main_online_bt).click() self.wait self.driver.find_element(By.ID,com.uet.teacherspad:id/linear_search).click() self.wait self.driver.find_element(By.XPATH,/com.uet
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 幼儿教师月工作总结模板(11篇)
- 数智驱动高等教育创新发展路径
- 创新药行业的未来发展与趋势解析
- 2025至2030年中国羽毛拍线行业发展研究报告
- 2025至2030年中国网类经编机数据监测研究报告
- 2025至2030年中国给水用硬聚氯乙烯管材行业投资前景及策略咨询报告001
- 2025至2030年中国线环钩导架连杆市场分析及竞争策略研究报告
- 2025至2030年中国纵梁行业投资前景及策略咨询研究报告
- 广西壮族自治区手足口病流行病学趋势特征与病原学分布变迁的研究
- 对分课堂教学模式在高中英语阅读教学中的实验研究
- OTN传输项目交付实施计划方案
- 固定顶、外浮顶和内浮顶储罐
- 千牛工作台操作图解PPT课件
- 铁路货车制动管系法兰用E形密封圈技术条件
- IH型化工离心泵设计
- 教师问责制度
- 最新空白办健康证用工证明1页
- 卫生院公共卫生工作计划
- 挂面生产线温湿度控制
- 血液透析血标本采集
- 高速公路半填半挖及填挖交界路基施工工法
评论
0/150
提交评论