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()