专栏首页Python自动化测试初始python单元测试框架unittest与webdriver的关系(一)

初始python单元测试框架unittest与webdriver的关系(一)

unittest是属于python的单元测试框架,和java的junit,c#的nunit雷同,unittest的详细说明,具体见官方的地址:https://docs.python.org/2/library/unittest.html。unittest单元测试给我们提供了创建测试用例,测试套件,以及测试固件。unittest在安装pyhton以后,直接自带了,可以直接使用。作为单元测试,是对程序最小模块的一种敏捷化的测试,更多的是开发作为对自己代码质量的一种考核,测试驱动的方法中,测试先行,开发接着来。在自动化测试中,我们虽然没有按照这样的模式来,但是有一个基本的事实的,当我们把selenium2的API全部学习完后,但是作为自动化测试来说,我们不可能把N个测试点,写在一个python的文件里面,即使一个简单的文本输入框,我们要测试它的边界值,敏感字符等,如果写在一个文件中,执行失败后,我们得仔细的查看到底是边界值出问题了还是其他出问题了,导致该部分执行失败,显然,这样的自动化,不是我们想要的,也会给成本增加很多的,也无法达到自动化的要求,更加无法处理几百几千个测试用例的批量执行。那么,就让我们来了解神秘的unittest,unittest的关系图具体见如下截图的层级关系:

Test Case

测试用例是单元测试中最小的单位,它的任务就是检查对于具体的功能是否和期望的功能一直,这期间会使用到assert等断言,对于一个单独的case来说,它具有稳定性,独立性,可持续性,以及期望结果等特点。

Test Suite

测试套件,顾名思义,就是测试容器,通俗的说就是一个或者多个测试用例的集合,一般我们会用到addTest(),makeSuite()等方法。

Test Runner

Test Runner是指执行测试套件中的测试用例,并且呈现给用户结果,一般会使用到run(),TextTestRunner()的方法。

Test Report

对自动化测试来说,测试报告是必须的,依据自动化的测试报告,我们可以详细的了解到通过或失败的测试用例,预期与结果的结果状态,在python的自动化测试中,一般通过HTMLTestRunner.py来实现的,HTMLTestRunner.py具体下面还会再详细介绍。

当然,如上的问题,就让selenium IDE给我们揭开谜底,我们层层剥开,进入TDD的测试模式。Seleniumide只可以安装在firefox中,看成firefox的一个插件安装进去,下载地址是selenium的官方地址(http://docs.seleniumhq.org/projects/ide/plugins.jsp),下载文件后,直接拖动到firefox的浏览器,点击选择全部安装,安装成功后,会提示重新启动浏览器,重新启动firefox的浏览器后,在工具栏,就可以看到seleniumide,点击seleniumide,显示出seleniumide的程序部分,见截图:

就已selenium ide录制百度搜索,来引入单元测试,打开百度,在搜索输入框中输入框webdriver,点击百度一下安装,见录制的截图:

点击selenium ide的文件下拉框,点击Export Test Case As,点击Python 2/unittest/webdriver,见截图:

保存文件为demo.py文件,打开demo.py文件,可以看到如下的代码:

# -*- coding: utf-8 -*-

from selenium import webdriver

from selenium.webdriver.common.byimport By

fromselenium.webdriver.common.keys import Keys

fromselenium.webdriver.support.ui import Select

from selenium.common.exceptionsimport NoSuchElementException

from selenium.common.exceptionsimport NoAlertPresentException

import unittest, time, re

class Demo(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url ="https://www.baidu.com/"

self.verificationErrors = []

self.accept_next_alert = True

def test_demo(self):

driver = self.driver

driver.get(self.base_url +"/")

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("webdriver")

driver.find_element_by_id("su").click()

def is_element_present(self, how, what):

try: self.driver.find_element(by=how,value=what)

except NoSuchElementException, e:return False

return True

def is_alert_present(self):

try: self.driver.switch_to_alert()

except NoAlertPresentException, e:return False

return True

def close_alert_and_get_its_text(self):

try:

alert = self.driver.switch_to_alert()

alert_text = alert.text

if self.accept_next_alert:

alert.accept()

else:

alert.dismiss()

return alert_text

finally: self.accept_next_alert = True

def tearDown(self):

self.driver.quit()

self.assertEqual([],self.verificationErrors)

if __name__ =="__main__":

unittest.main()

如上的代码,就是一个完整的自动化的case,下面分别解释下代码部分:

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url ="https://www.baidu.com/"

self.verificationErrors = []

self.accept_next_alert = True

def tearDown(self):

self.driver.quit()

self.assertEqual([],self.verificationErrors)

如上代码部分为unittest的测试固件,分别为setUp和tearDown(),在 setUp部分中,打开url,也就是测试地址https://www.baidu.comtearDown()部分是结束测试,重点说明,setup 和tearDown()部分,有多少个自动化的case,就执行多少次。

def test_demo(self):

driver = self.driver

driver.get(self.base_url +"/")

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("webdriver")

driver.find_element_by_id("su").click()

如上代码为测试点部分,该测试点为在百度搜索输入框输入webdriver,然后点击百度一下,重点说明,在python的unittest的单元测试中,开头必须是test,否则unittest会不识别的。

那么精简后的自动化测试脚本为:

# -*- coding: utf-8 -*-

from selenium import webdriver

from selenium.webdriver.common.byimport By

fromselenium.webdriver.common.keys import Keys

fromselenium.webdriver.support.ui import Select

from selenium.common.exceptionsimport NoSuchElementException

from selenium.common.exceptionsimport NoAlertPresentException

import unittest, time, re

class Demo(unittest.TestCase):

def setUp(self):

self.driver = webdriver.Firefox()

self.driver.implicitly_wait(30)

self.base_url =https://www.baidu.com/

def test_demo(self):

driver = self.driver

driver.get(self.base_url +"/")

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("webdriver")

driver.find_element_by_id("su").click()

def tearDown(self):

self.driver.quit()

if __name__ =="__main__":

unittest.main()

本文分享自微信公众号 - Python自动化测试(wuya-python),作者:无涯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-08-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 测试驱动之一个登录引发的思考与总结(七)

    测试驱动开发模式在今天已经不是什么新鲜事了,它要求开发在写业务代码的时候,先写出测试代码,,同时单元测试例子决定了如何来写产品的代码,并且不断的成功的执...

    无涯WuYa
  • sqlite3数据库在自动化中的使用

    之前介绍了在python中怎么对sqlite3数据库进行操作,今天再详细的介绍,怎么把自动化中使用到的数据存储在sqlite3数据库的文件中,然后在自...

    无涯WuYa
  • 自动化测试中对js的处理

    在自动化测试中,某些问题无法解决,我们可以执行javascript代码通过seleniumwebdriver的使用方法来解决我们遇到的问题,如浏览器显示的内容...

    无涯WuYa
  • 《一头扎进》系列之Python+Selenium框架设计篇2- 价值好几K的框架,不看白不看,看了还想看

      上一篇介绍了自动化框架的架构,今天宏哥就带领小伙伴或者童鞋们开始开工往这个框架里开始添砖加瓦。主要是介绍一个框架unittest单元测试框架和一种设计思想...

    北京-宏哥
  • 【Pygame 第6课】 面向对象的游戏设计

    上节课中,我们的飞机已经可以发射子弹了,尽管只有一颗。为什么我只加了一颗?试着多加几颗你就会发现,你得用好几个变量去分别记录它们的xy坐标,在主循环中判断每一颗...

    Crossin先生
  • Windows安全认证是如何进行的?[Kerberos篇]

    最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证、非对称加密、数字证书、数字签名、TLS/SSL、WS-Security等。如果时...

    蒋金楠
  • Python 为什么要保留显式的 self ?

    大家知道 Python 的类方法里都要带个 self,而不像其它语言那样隐藏起来,这让人略有不爽。与人讨论后得知 Guido 曾经专门撰文解释过这个问题。我抽空...

    Crossin先生
  • Python 为什么要保留显式的 self ?

    布鲁斯·埃克尔(Bruce Eckel)发了篇博文[1],提议从类方法的形参列表中删除“self”。我将解释为什么这个提议不能通过。(译注:Bruce 是《Th...

    Python猫
  • 超声波追踪技术可以暴露Tor用户的真实信息

    很多广告商会在自己的网页广告中使用一种名叫uXDT的技术,这项技术可以帮助他们追踪用户的访问习惯,这样就可以更有针对性地向用户投放广告了。此时,攻击者就可以在一...

    FB客服
  • python-selenium Page

    Page Object是一种程序设计模式,将面向过程转变为面向对象(页面对象),将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。可...

    py3study

扫码关注云+社区

领取腾讯云代金券