selenium+python—实现自动化测试基本思路
测试是一个贯穿于整个开发过程的连续过程,测试最基本的原理就是比较预期结果是否与实际执行结果相同,如果相同则测试成功,否则测试失败。
为了让单元测试代码能够被测试和维护人员更容易地理解,最好的解决办法是遵循一定的规范来编写用于测试的代码,具体到Python程序员来讲,则是要采用unittest这一自动测试框架来构造单元测试用例。目前PyUnit已经得到了大多数Python开发人员的认可,成了事实上的单元测试标准。如果采用unittest来进行同样的测试,则测试代码将下所示:
from widget import Widget
import unittest
# 执行测试的类
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget()
def tearDown(self):
self.widget = None
def testSize(self):
self.assertEqual(self.widget.getSize(), (40, 40))
# 构造测试集
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
return suite
# 测试
if __name__ == "__main__":
unittest.main(defaultTest = 'suite')
在采用unittest这一单元测试框架后,用于测试的代码做了相应的改动:
- 用import语句引入unittest模块。
- 让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合。
- 在setUp()方法中进行测试前的初始化工作,并在tearDown()方法中执行测试后的清除工作,setUp()和tearDown()都是TestCase类中定义的方法。
- 在testSize()中调用assertEqual()方法,对Widget类中getSize()方法的返回值和预期值进行比较,确保两者是相等的,assertEqual()也是TestCase类中定义的方法。
- 提供名为suite()的全局方法,PyUnit在执行测试的过程调用suit()方法来确定有多少个测试用例需要被执行,可以将TestSuite看成是包含所有测试用例的一个容器。
虽然看起来有点复杂,但PyUnit使得所有的Python程序员都可以使用同样的单元测试方法,测试过程不再是杂乱无章的了,而是在同一规范指导下进行的有序行为,这就是使用PyUnit这一自动单元测试框架所带来的最大好处。
1、用unittest框架写自动化用例:
#! /usr/bin/env python '''
Date:2017.12.26
Author:Ranxf
Project:xin300平台BS
''' import unittest
from selenium import webdriver class XzrsPlantBs(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox() # 选择火狐浏览器
def test_xzrsPlantBs(self):
pass
def tearDown(self):
self.driver.quit() # 退出浏览器
2、断言,检查跳转的网页是否和实际一致
断言网址时需注意是否为伪静态(PATH_INFO)或者GET,前者采用路径传参数(sys/user-creat.html),后者通过字符查询传参数(main.action?type=guide)
当采用不同方式校验网址会发现变化。
self.assertEqual("http://10.1.1.166:8080/xzrs/main.action?type=guide",
self.driver.current_url,"登录跳转失败")
3、利用Page模式实现看复用的用例
关于Page模式:
- 抽象出来一个BasePage基类,它包含一个指向Selenium.webdriver的属性
- 每一个webpage都继承自BasePage基类,通过driver来获取本页面的元素,每个页面的操作都抽象为一个个方法
- TestCase继承自unittest.Testcase类,并依赖相应的Page类来实现相应的test case步骤
后台BS端登录页面为BasePage,代码如下BasePage.py:
'''
Date:2017.12.26
Author:Ranxf
''' from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys # super class
class BasePage(object):
def __init__(self, driver):
self.driver = driver # page element identifier
class LoginPage(BasePage):
username = (By.ID, 'userID')
password = (By.ID, 'password')
dialogTitle = (By.ID, '')
loginButton = (By.ID, 'login') # Get userneme textbox and input username
def set_username(self, username):
name = self.driver.find_element(*LoginPage.username)
# name.send_key(username) # get passowd textbox and input password
def set_password(self, password):
pwd = self.driver.find_element(*LoginPage.password)
pwd.send_keys(password + Keys.RETURN) # Get "登录" button and then click
def click_login(self):
lgn = self.driver.find_element(*LoginPage.loginButton)
lgn.click()
Test_Login.py:
'''
Date:2017.12.26
Author:Ranxf
''' from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
import unittest
import time
import sys
import BasePage # print(sys.path) class Test_Login(unittest.TestCase):
# setup
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://10.1.1.166:8080/xzrs/" def test_Login(self):
# Step1:open base site
self.driver.get(self.base_url) # Step2:open login page
login_page = BasePage.LoginPage(self.driver) # step3:Enter username
login_page.set_username('') # step4:enter password
login_page.set_password('admin') # step5: click login
login_page.click_login() # tearDown
def tearDown(self):
self.driver.quit() if __name__ == '__main__':
unittest.main()
Page模式:
1. 易读性: 现在单看test_login方法,确实有点test case的样子了,每一步都很明了
2. 可扩展性:由于把每个page的元素操作都集成到一个page类中,所以增删改查都比较方便
3. 可复用性: page的基本操作都变成了一个个的方法,在不同的test case中可以重复使用
4. 可维护性:如果页面修改,只需修改相应page类中的方法即可,无需修改每个test case
参考文档:
http://www.cnblogs.com/AlwinXu/p/5537955.html
https://www.ibm.com/developerworks/cn/linux/l-pyunit/
https://www.cnblogs.com/melodylin/p/5656185.html
http://blog.csdn.net/huilan_same/article/details/52559711
selenium+python—实现自动化测试基本思路的更多相关文章
- 【selenium+python】自动化测试目录与文件结构
一.首先,看一下完整的项目目录结构图,如下: ==================目录结构================== ==================目录结构============== ...
- selenium + python网页自动化测试环境搭建
1.python的安装 ,这个不解释,exe文件运行安装即可,既然你选择python,相信你是熟悉python的,我安装目录C:\Python27 2.setuptools 的安装也非常简单,同样是e ...
- selenium + python 部署自动化测试环境
选择selenium和python其实是怀有私心的:码两行python,熟悉熟悉. selenium优点很多,我最看重的是支持多语言,足够简单,同时支持浏览器. 实际工作中,简单实用真的太重要了 ...
- selenium +python web自动化测试环境搭建
基础框架搭建 1.安装python 2.安装selenium cmd输入pip install selenium 问题:在python中输入from selenium import webdriver ...
- Selenium + Python + Chrome 自动化测试 环境搭建
一.下载Python 相关的教程很多,此处不详细记录了,下面是官网下载地址: https://www.python.org/downloads/ 我使用的python版本为 Python 3.6.1 ...
- Selenium+Python:下载文件(Firefox 和 Chrome)
引自 https://blog.csdn.net/Momorrine/article/details/79794146 1. 环境 操作系统 Win10 IDE Eclipse (Oxyg ...
- Mac OS下应用Python+Selenium实现web自动化测试
在Mac环境下的自动化测试环境搭建这里有一篇亲测通过的文<mac下怎么搭建selenium python环境?>. 不过在这个过程中要注意两点: 1.在终端联网执行命令“sudo pip ...
- selenium + python 自动化测试环境搭建
selenium + python 自动化测试 —— 环境搭建 关于 selenium Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操 ...
- selenium+python环境的搭建的自动化测试
一.安装python: 我安装的是2.7.13版本的:可以在CMD下 运行python命令查看是否安装python,以及安装版本: 在https://www.python.org/getit/这个地址 ...
随机推荐
- Linux atop监控工具部署
一.atop简介 atop是一款用于监控Linux系统资源与进程的工具,它以一定的频率记录系统的运行状态,所采集的数据包含系统资源(CPU.内存.磁盘和网络)使用情况和进程运行情况,并能以日志文件的方 ...
- Android无线测试之—UiAutomator UiScrollable API介绍七
滑动到某个对象 一.滑动到某个对象相关API 返回值 API 描述 boolean scrollIntoView(UiSelector selector) 滑动到条件元素所在位置,并且尽量让其居于屏幕 ...
- iOS:友盟SDK第三方登录 分享及友盟统计的使用
本文转载至 http://www.it165.net/pro/html/201503/37101.html Tag标签:第三方 01.#import "UMSocial.h" ...
- sql语法:从一个表update到另外一个表
sql语法:从一个表update到另外一个表 一. update a set a.name=b.name1 from a,b where a.id=b.id 二. update table1 set ...
- globalToLocal和localToGlobal
官方API: groupOut全局坐标(50,50) gourpIn全局坐标(100,100),并嵌套在groupOut里 btn全局坐标(150,150),并嵌套在groupIn里 获取组件全局坐标 ...
- Android得到SD卡文件夹大小以及删除文件夹操作
float cacheSize = dirSize(new File(Environment.getExternalStorageDirectory() + AppConstants.APP_CACH ...
- js 空正则匹配任意一个位置
看一个正则 这里明显,起到匹配作用的是 | 后的,可 | 后什么都没有,原理不知道,也没有搜到文献,只有在 Reg101 上是这样解释的, 所以得出结论: js 中,空正则匹配任意一个位置. 不过,这 ...
- 170502、linux下配置jdk8
1.下载源码包jdk-8u45-linux-x64.tar.gz(省略) 2.解压 tar -zxvf jdk-8u45-linux-x64.tar.gz 3.配置jdk vi /etc/profil ...
- 20165330 2017-2018-2 《Java程序设计》第1周学习总结
教材学习内容总结 java的历史,地位,特点. java的平台介绍 java应用程序的开发及源文件的编写规则 java反编译特点 安装JDK Windows上 在安装JDK后设置系统环境变量,因为我的 ...
- HAPROXY简介
HAProxy 是一款高性能TCP/HTTP 反向代理负载均衡服务器,具有如下功能: 根据静态分配的cookies完成HTTP请求转发 在多个服务器间实现负载均衡,并且根据HTTP cookies 实 ...