分享
分销 收藏 举报 申诉 / 29
播放页_导航下方通栏广告

类型联教-测试部-[web自动化]-培训3-unittest框架.docx

  • 上传人:天****
  • 文档编号:3940611
  • 上传时间:2024-07-24
  • 格式:DOCX
  • 页数:29
  • 大小:37.26KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    web自动化 联教 测试 web 自动化 培训 unittest 框架
    资源描述:
    联教/测试部 WEB自动化测试培训 3 WEB自动化测试培训3 2016/06/03 课程讲师 肖能尤 课程目的 熟悉和掌握Unittest单元测试框架 课程内容 1 Unittest单元测试框架介绍 unittest是python的单元测试框架, 在python的官方文档中,对unittest有详细的介绍,想更深一步研究的同学可以到https://www.python.org/doc/去了解,当然,我这里也会接介绍的.unittest单元测试提供了创建测试用例,测试套件以及批量执行的方案,unittest在安装pyhton以后就直接自带了,直接import unittest就可以使用。作为单元测试的框架,unittest也是可以对程序最小模块的一种敏捷化的测试。在自动化测试中,我们虽然不需要做白盒测试,但是必须需要知道所使用语言的单元测试框架,这是因为把selenium2的API全部学习完后,就会遇到用例的组织问题,虽然函数式编程和面向对象编程提供了对代码的重构,但是对于所编写的每个测试用例,总不能编写成一个函数(方法)来调用执行吧?很显然,这是不明智的作法。利用单元测试框架,创建一个类,该类继承unittest的TestCase,这样可以把每个case看成是一个最小的单元,由测试容器组织起来,到时候直接执行,同时引入测试报告(这是一直所期望的),对于unittest部分,下面详细的依次介绍.unittest各组件的关系为: 1.1 unittest模块实战 unittest支持测试的自动化处理,也同时包含测试的初始化和结束测试,以及把测试用例按模块化封装成一个测试套件,来进行批量的处理。在一个模块化的测试用例中,包含共同的代码,如公司教务网的登录的测试用例,都得先打开浏览器访问项目地址,执行测试用例完成后,关闭浏览器结束测试,一般开始使用“setUp”表示,结束使用“tearDown”,setUp和tearDown被称为测试固件。在测试执行的时候,setUp首先被执行,而且仅会执行一次,这个方法执行通过后,不管后面的测试是否通过,都会执行tearDown来结束测试。在unittest中,提供了TestRunner来为运行测试,该类对象提供了run方法,其中接受TestCase或者TestSuite参数,并且返回测试结果,一般经常使用的是TextTestRunner运行器,可以看成是测试容器.下面写以教务网的登陆例子来验证登陆这个用例是否登陆成功来说明 备注:切记在unittest中,测试用例必须以test开头. 实现的代码: 代码: # -*- coding: utf—8 —*- from selenium import webdriver from selenium。webdriver。support.ui import Select import unittest, time, re class Login(unittest.TestCase): def setUp(self): self。driver = webdriver。Firefox() self.driver。implicitly_wait(30) self。base_url = ”http://192。168.30.180/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_element_by_id(”txtUserName”).send_keys("18634564149") 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(verbosity=2) 运行结果: 脚本讲解: 我们来详细的介绍下如上的代码和输出结果,导入了unittest,创建了测试的类(测试模块名称),继承TestCase,在测试固件中分别写的测试时候的初始化和测试结束后资源释放的代码,中间test_login是测试用例,也就是自动化的测试用例,在主函数中,直接调用main(),在main中加入verbosity=2,这样测试的结果就会显示的更加详细。 这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值 0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80 1 (默认模式): 非常类似静默模式 只是在每个成功的用例前面有个“.” 每个失败的用例前面有个 “F" 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息 在编写的每个case中,可以加注释,这样在测试结果中,我们就知道该case是测试那个功能的,如上的截图,依据测试结果,我们就知道第一个testcase是测试登陆的. 1.2 构建测试套件 在1.1介绍测试模块的时候,借助unittest测试框架编写了一个简单的case,在节中,来介绍怎么构建测试套件,测试套件顾名思义就是测试用例的容器。 在说明测试套件的时候,以老师平板的项目为案例,来说明测试套件在项目中的实际应用。新建testCase的package,在package中创建test_a1_login 登陆模块和test_a10_safe_custody 安全监护模块等,见目录结构 test_a10_safe_custody模块代码: #coding:utf—8 from appium import webdriver from selenium import webdriver from time import sleep from mon。by import By import unittest,sys sys。path.append('./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 self.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_element(By.ID,”com。uet.teacherspad:id/rdobtn_obverse”)。click() self.wait if __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类来生成测试套件,使用该类的构造函数可以生成一个测试套件的实例,该类提供了addTest来把每个测试用例加入到测试套件中。在weke模块中编写了测试使用到的方法,下来我们test_a10_safe_custody模块中编写几个测试用例,以实例的方式来说明addTest的应用,见wekeTest模块中的代码和执行结果截图: 代码: #coding:utf-8 from appium import webdriver from selenium import webdriver from time import sleep from mon。by import By import unittest,sys sys。path.append('./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 self。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_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 = 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.2 makeSuite() 在介绍addTest()方法的时候,就说到了它的缺点,重复造轮子并不是想要的,但是代码还是得一步一步的重构。在unittest框架中提供了makeSuite()的方法,makeSuite可以实现把测试用例类内所有的测试case组成的测试套件TestSuite,unittest调用makeSuite的时候,只需要把测试类名称传入即可。把上面的代码使用makeSuite重构后为: 代码重构: #coding:utf-8 from appium import webdriver from selenium import webdriver from time import sleep from selenium。mon.by import By import unittest,sys sys.path.append(’。/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 self。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_element(By。ID,”com。uet。teacherspad: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用于创建类和模块的测试套件,一般的情况下,使用 TestLoader().loadTestsFromTestCase(TestClass)来加载测试类. 实现的代码: #coding:utf-8 from appium import webdriver from selenium import webdriver from time import sleep from selenium.webdriver。common。by import By import unittest,sys sys。path.append(’./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 self。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_element(By。ID,”com.uet。teacherspad:id/rdobtn_obverse”).click() self。wait if __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。4 discover() discover是通过递归的方式到其子目录中从指定的目录开始,找到所有测试模块并返回一个包含它们对象的TestSuite,然后进行加载与模式匹配唯一的测试文件,discover参数分别为discover(dir,pattern,top_level_dir=None).修改下之前的模块,把测试脚本的模块放在TestCase的模块下,把被调用测试的文件放在Page的模块下,见调整后的目录截图: 截图显示为调整后的目录结构,分别讲一个测试用例和run_teacherspad_test。的实现源码。 test_a10_safe_custody模块的代码: #coding:utf-8 from appium import webdriver from selenium import webdriver from time import sleep from selenium。mon。by import By from appium。webdriver。common.touch_action import TouchAction import unittest,sys sys。path.append('./page') from page。baseTestCase import AppTestCase class 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 #今日任务—作业待改 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 #今日任务—在线答疑-查看全部 def 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。HListView[contains(@resource—id,'com。uet.teacherspad:id/lv_content')]/android。widget.RelativeLayout[1]")。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.HListView[contains(@resource-id,'com。uet。teacherspad:id/lv_content')]/android。widget.RelativeLayout[2]”).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。find_element(By.XPATH,”//android.widget。ListView[contains(@resource—id,’com。uet。teacherspad:id/lv_left_list’)]/android。widget.LinearLayout[1]")。click() self。wait #今日任务—在线答疑—答复第一个(最新)提问 def test_a7_task_online_firstQuestion_reply1(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。ListView[contains(@resource-id,’com。uet.teacherspad:id/lv_left_list’)]/android。widget.LinearLayout[1]”).click() self。wait self.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 #今日任务—在线答疑—答复第一个(最新)提问 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。XPATH,”//android.widget。ListView[contains(@resource—id,’com.uet。teacherspad:id/lv_left_list’)]/android.widget.LinearLayout[1]")。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(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.ListView[contains(@resource-id,'com。uet。teacherspad:id/lv_left_list')]/android.widget.LinearLayout[1]")。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): ''’点击在线答疑-不公开第一个提问(列表中最新的问题)''’ 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。ListView[contains(@resource—id,’com.uet。teacherspad:id/lv_left_list')]/android.widget。LinearLayout[1]”).click() self.wait self。driver。find_element(By.ID,’com.uet.teacherspad: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。ListView[contains(@resource-id,’com。uet.teacherspad:id/lv_left_list’)]/android。widget.LinearLayout[2]")。click() self。wait self。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 #今日任务—在线答疑—搜索 def test_a13_task_online_search(self): ’''点击在线答疑—搜索''’ self.driver.find_element(By。ID,'com.uet.tea
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:联教-测试部-[web自动化]-培训3-unittest框架.docx
    链接地址:https://www.zixin.com.cn/doc/3940611.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork