第五章 自动化测试模型
一个自动化测试框架就是一个集成体系,在这一体系中包含测试功能的函数库、测试数据源、测试对象识别标准,以及种可重用的模块。自动化测试框架在发展的过程中经历了几个阶段,线性测试、模块驱动测试、数据驱动测试、关键字驱动测试。
Python 提供了以下几种读取文件的方式。
l read() 读取整个文件。
l readline() 读取一行数据。
l readlines() 读取所有行的数据。
下面通过读取csv 文件的方法来解决这个每次要读取多个信息的问题。
首先创建userinfo.csv 文件,通过WPS 表格或Excel 创建表格,文件另存为选择CSV 格式进行保存,注意不要直接修改Excel 的后缀名来创建CSV 文件,这样创建出来的并非真正的CSV 文件。
loop_reader.py
#coding=utf-8
import csv
my_file='userinfo.csv'
data=csv.reader(file(my_file,'rb'))
for user in data:
print user
第六章 unittest 单元测试框架
6.1 分析带unittest 自动化测试脚本
Baidu_with_unittes.py
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys importKeys
from selenium.webdriver.support.ui importSelect
from selenium.common.exceptions importNoSuchElementException
from selenium.common.exceptions importNoAlertPresentException
import unittest, time, re
class BaiduTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
self.verificationErrors = []
self.accept_next_alert = True
def test_baidu(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("seleniumide")
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()
import unittest:首先要引入unittest框架包。
class BaiduTest(unittest.TestCase): Baidu 类继承unittest.TestCase类,从TestCase 类继承是告诉unittest 模块的方式,这是一个测试案例。
setUp 用于设置初始化工作,在每一个测试用例前先被执行,它与tearDown方法相呼应,后者在每一个测试用例执行后被执行。这里的初始化工作定义了浏览器启动和基础URL 地址。
定义空的verificationErrors 数组,脚本运行时的错误信息将被打印到这个数组中。
定义accept_next_alert 变量,表示是否继续接受下一个警告,初始化状态为Ture。
test_baidu 中放置的就是我们的测试脚本.
is_element_present 方法用来查找页面元素是否存在,通过find_element()来接收元素的定位方法(how)和定位值(what),如果定位到元素返回Ture,否则出现异常并返回Flase.
is_alert_present()方法用来处理弹出的警告框,用WebDriver 所提供的switch_to_alert()方法来捕捉警告框。如果捕捉到警告框返回Ture,否则异常,返回Flase。
close_alert_and_get_its_text()关闭警告并且获得警告信息。首先通过switch_to_alert()获得警告,通过.text 获得警告框信息。接着通过if 语句判断accept_next_alert 的状态,在setUp()已经初始化状态为Ture,如果为Ture,通过accept()接受警告。否则dismiss()忽略此警告。
tearDown 方法在每个测试方法执行后调用,这个方法用于完成测试用例执行后的清理工作,如退出浏览器、关闭驱动,恢复用例执行状态等。
在setUp()方法中定义了verificationErrors 为空数组,这里通过assertEqual()比较其是否为空,如果为空说明用例执行的过程过程中没有出现异常,否则将抛出AssertionError 异常。
if __name__ == "__main__":
unittest.main()
整个测试过程集成在unitest.main()模块中,其默认执行以test 开头的方法。
.py 文件有两种使用方式:作为模块被调用和直接使用。如果它等于"__main__"就表示是直接执行。
6.2unittest 单元测试框架解析
单元测试负责对最小的软件设计单元(模块)进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误。在Python 语言下有诸多单元测试框架,如unittest、Pytest、nose 等,其中unittest框架(原名PyUnit 框架)为Python 语言自带的单元测试框架,从Python 2.1 及其以后的版本都将PyUnit 作为一个标准模块放入Python 开发包中。
6.2.1 认识单元测试
单元测试本身就是通过一段代码去验证另一个代码,所以不用单元测试框架也可以写单元测试.
count.py
#coding=utf-8
class Count:
def __init__(self,a,b):
self.a=a
self.b=b
de fadd(self):
returnself.a+self.b
def sub(self):
return self.a-self.b
程序非常简单,创建一个Count 类用来计算两个数,通过__init__()方法对两个数进行初始化,接着常见add()方法返回两个数相加的结果, 接着常见sub()方法返回两个数相减的结果。
通过手工方式所进行的单元测试可能是下面(testCount.py)这个样子的:
#coding=utf-8
from count import Count
class TestCount:
def test_add(self):
try:
c=Count(4,5)
add=c.add()
assert(add==9),'Integer addition result error!'
excep tAssertionError,msg:
printmsg
else:
print"test pass!"
def test_sub(self):
try:
c=Count(9,2)
sub=c.sub()
assert(sub==7),'Integer addition result error!'
except AssertionError,msg:
printmsg
else:
print"test pass!"
mytest=TestCount()
mytest.test_add()
mytest.test_sub()
首先,引入count 文件下的Count 类,在test_add()方法中调用Count 类并传入两个参数4,5,调用Count类中的add()方法对两个参数做加法运算,通过assert()方法进行比较返回结果add 是否等于9;在test_sub()方法中调用Count 类并传入两个参数9,2,调用Count类中的sub()方法对两个参数做加法运算,通过assert()方法进行比较返回结果add 是否等于7,如果不相等则抛出自定义的“Integer addition result error!”异常信息,如果相等则打印“testpass!”。
由于测试代码甚至比被测试的代码还多,则是要采用unittest 这一自动测试框架来构造单元测试用例。通过unittest 来写单元测试:test_with_unittest.py
#coding=utf-8
from count import Count
import unittest
class TestCount(unittest.TestCase):
def setUp(self):
self.j=Count(4,5)
def test_add(self):
self.add=self.j.add()
self.assertEqual(self.add,9)