【unittest】
什么是框架?
框架其实定制研发的应用骨架,它对基础的代码进行了封装并且提供API接口。其他开发只要直接调用封装好的API接口即可,从而提高工作效率。
unittest自动化框架介绍
自动化测试为了对一个系统做自动化而封装的一个代码主骨架,其他自动化测试工程师只要去调用这个骨架里面的方法就可以实现自动化测试,这个主骨架就是自动化框架。unittest是Python语言自带的单元测试框架,做功能自动化和接口测试时也都可以使用这样的框架来管理代码
1、自动化的作用
(1)提高测试效率,降低维护成本
(2)减少人工干预脚本因素
(3)增加代码的可重用率
2、unittest单元测试框架和自动化测试框架的关系
单元测试:我们针对程序的最小单元(方法)进行测试
自动化框架的重要组成部分:
unittest
pom
ddt数据驱动
全局配置文件封装
selenium二次封装
日志监控
断言
报告及邮件发送
3、unittest框架主要做了什么?
(1)测试发现:从多个.py文件中收集并且加载测试用例
(2)测试执行:将测试用例按照一定的顺序和条件去执行并且生成结果
(3)测试判断:通过断言去判断结果是否正确
(4)测试报告:统计测试进度、通过率、生成报告
4、unittest重要组件
(1)TestCase:是测试的最小单元模块。
(2)TestSuite:是测试集,它被用于把测试整合在一起,批量运行测试。
(3)TestFixture:表示执行一个或者多个测试前的准备工作,确保每个测试之间的独立性。其中 setUp() 和 tearDown() 是最常用的方法
(4)TestLoader:是用来加载 TestCase到TestSuite中
(5)TestRunner:是运行测试器, 测试运行器是协调测试执行并向用户提供结果的组件
5、用例编写规则
unittest:提供了testcase测试用例,testsuites测试套件、testfixtrue测试固件或者夹具,testloader测试加载器,testrunner测试运行器。必须遵守以下原则:
(1)测试文件必须先导入import uinttest
(2)测试类必须继承unittest.TestCase
(3)测试方法必须以test开头
6、TestCase用法
import unittest
import requests
import os,sys
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,parentdir)
from db_fixture import test_data
class login_test(unittest.TestCase):##创建login_test测试类,继承unittest.TestCase类:创建测试用例,调用添加发布会接口,验证并返回数据
##登录
def setUp(self):
self.base_url = "http://127.0.0.1:8000/login_action/"
def tearDown(self):
print()
def test_login_success(self):#添加成功
payload = {'username':'admin','password':'admin123456'}
r =requests.post(self.base_url,data=payload)
print(r.status_code)
self.assertEqual(r.status_code, 200)
运行方式:
(1)使用unittest命令行的命令行方式运行
python -m unittest -v login_test.login_test
python -m 以脚本的方式运行一个模块
unittest -v 更详细的输出结果
login_test.login_test 模块名.类名.方法名
-k匹配模式:
1.通配符 -k *test_login_success
2、字符串 -l login_success
(2)使用unittest.main
直接在pycharm中运行
unittest 的单元测试库提供了标准的断言方法
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b 2.7
assertIsNot(a, b) a is not b 2.7
assertIsNone(x) x is None 2.7
assertIsNotNone(x) x is not None 2.7
assertIn(a, b) a in b 2.7
assertNotIn(a, b) a not in b 2.7
assertIsInstance(a, b) isinstance(a, b) 2.7
assertNotIsInstance(a, b) not isinstance(a, b) 2.7
【selenium的工作原理】
脚本启动driver,启动浏览器作为远程服务器,执行脚本发送请求,服务器解析请求做出相应的操作,反馈给客户端(脚本)。我们做的web ui的自动化测试,大部分都是在使用webdriver提供的API来模拟手动测试过程中的一系列动作和行为。
什么是po模型
page object的统称,是一种设计思想,把一个页面当作一个对象,页面的元素与元素之间操作方法就是页面对象的属性与行为,一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法。
po模式一般分为三层。基础封装层BasePage、PO页面对象层、TestCase测试用例层
selenium常用的定位方式
id 、classname、tagname、linktext、patrillinktext、xpath、css_selector。常用id、classname、xpath、css_selector
遇到frame框架页面处理
先用driver.switch_to.frame(可自行分装id/xpath)
操作页面元素
driver.switch_to.default_content()
下拉菜单处理方式
1.如果是select
selenium中的select类
a、定位元素
b、将元素转化成select对象
c、通过下标或者文本选择
sel.select_by_index(index)
sel.select_by_value(value)
sel.select_by_visible_text(text)
2.非select
找到元素,采用2次点击方式定位
上传图片的几种方式
1.sendkeys
input属性,且type="file",直接使用sendkeys
非input属性:借助python中的win32 api、win32 con模拟按键输入
2.AutoIt工具
3.模拟按键
自动化的三种等待方式
1.time.sleep(1),一般建议少用
2.implicitly_wait():等待直到元素加载完成
4.explicit_wait():显性等待
3.WebDriverWait:显示等待,自定义函数代码,等待某个函数加载完成
ddt数据驱动
通过数据驱动改变数据,即对测试数据进行参数化,来驱动测试的执行,实现了数据和代码的分离,是unittest中实现数据驱动的主要方式之一。
ddt.ddt:
装饰类,也就是继承自 TestCase 的类,标记测试类,支持DDT数据驱动。
ddt.data:
装饰测试方法。参数是一系列的值。标记测试用例,传递参数
ddt.file_data:
装饰测试方法。标记测试用例,传递文件。文件可以是json 或者 yaml类型
ddt.unpack:
传递的是复杂的数据结构时使用。比如使用元组或者列表,添加 unpack 之后,ddt 会自动把元组或者列表对应到多个参数上。
:
传入序列时,必须使用拆包,否则会将会整个数据作为一个整体传入
unpack与*区别
*是对传入的序列进行拆包,拆包后将元素依次传给测试用例,表示用例执行次数
@unpack是对每次传入用例的参数进行拆包,拆包后将元素依次传给用例的每个参数,表示执行每次用例时的参数
【问题】:
1.在你做自动化过程中,遇到了什么问题吗?
有遇到问题和挑战,主要有以下几点:
频繁地变更UI,经常要修改页面对象里面代码
运行用例报错和处理,例如元素不可见,元素找不到这样异常
测试脚本复用,尽可能多代码复用
一些新框架产生的页面元素定位问题
2.举例一下你遇到过那些异常,在selenium自动化测试过程中
写脚本过程最常见的异常就是,这个元素无法找到。
常见的selenium有以下这些:
ElementNotSelectableException :元素不能选择异常
ElementNotVisibleException :元素不可见异常
NoSuchAttributeException :没有这样属性异常
NoSuchElementException:没有该元素异常
NoSuchFrameException :没有该frame异常
TimeoutException : 超时异常
Element not visible at this point :在当前点元素不可见
如何处理alert弹窗
我们常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗
我们知道,webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。相关操作代码如下:
// 切换到Alert
Alert alert = driver.switchTo().alert();
// 点击弹窗上确定按钮
alert.accept();
// 点击弹窗的取消按钮
alert.dismiss()
// 获取弹窗上线上的文本文字内容
alert.getText();
// 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入
alert.sendkeys();
在selenium中如何处理多窗口?
swithTo方法如何处理下拉菜单?
通常我们也可以通过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操作。
基本使用语法是这样的:
Select Se=new Select(element);
Se.selectByIndex(index);
Se.selectByvalue(value);
Se.selectByVisibleText(text);
6.日历处理
1.通过元素定位实现2次点击选择
2.借助javascript
3.直接sendKeys()方法来实现传入一个时间的数据
- 关闭浏览器中quit和close的区别
close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session
8.页面加载超时
我们可以通过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);
- 什么是JavaScript Executor,你什么时候会用到这个?
JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。
JavascriptExecutor js =(JavascriptExecutor) driver;
js.executeScript(Script,Arguments);
10.Selenium中如何实现截图
在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法
self.driver.get_screenshot_as_file(img_path + nowTime + img_name + '.png')
11.Selenium中如何实现拖拽滚动条
12.介绍python+selenium+unittest+ddt web自动化框架