赞
踩
场景3_新建一个job.py
#####################################
- # -*- coding: gbk -*-
- from operations import Operations
- from log import logger
- from browser import Browser
-
- from domain.jenkins import Jenkins
-
- logger.info("测试场景3开始:创建一个job")
- browser = Operations(Browser.start_chrome())
-
- logger.info("测试前置条件:预先删除原有的同名job,job名字={job_name}")
- # 准备一个Jenkins类的实例,用来做测试的各种准备工作
- admin = Jenkins()
- job_name = "场景3测试job"
- # 不管job存在不存在,总之删一下试试,如果存在则删除掉,不存在则忽略
- admin.delete_job(job_name)
- # 快捷登陆
- admin.login_jenkins(browser)
-
- # 真正要测的场景开始
- # 点击左侧新建item的链接来创建一个jenkins job
- browser.click("css:a[href='/view/all/newJob']")
- # 输入job名称
- browser.input("id:name", job_name)
- # 选择job类型
- browser.click("css:li[class='hudson_model_FreeStyleProject']")
- # 点击确定按钮
- browser.click("id:ok-button")
- # 点击保存按钮
- browser.click("xpath://button[text()='保存']")
- # 真正要测的场景完毕
-
- #验证job是否创建成功
- assert admin.check_if_job_existed(job_name),f"创建失败:job名称={job_name}"
-
- # 关闭浏览器
- browser.close()
- logger.info("测试场景3结束")
运行结果,屏幕显示以下内容:
- [2021-12-01 13:45:21.141879]测试场景3开始:创建一个job
- [2021-12-01 13:45:21.141879]启动Chrome浏览器
- [2021-12-01 13:45:22.368721]测试前置条件:预先删除原有的同名job,job名字={job_name}
- [2021-12-01 13:45:22.590128]job=场景3测试job已删除
- [2021-12-01 13:45:22.590128]浏览器打开url=http://localhost:8080/
- [2021-12-01 13:45:22.787905]开始检查cookie是否还有效:
- [2021-12-01 13:45:22.787905]启动Chrome浏览器headless模式
- [2021-12-01 13:45:23.734861]浏览器打开url=http://localhost:8080/
- [2021-12-01 13:45:23.998166]开始保存cookie到path=cookies.txt
- [2021-12-01 13:45:23.998166]增加cookis={'httpOnly': False, 'name': 'screenResolution', 'path': '/', 'secure': False, 'value': '800x600'}
- [2021-12-01 13:45:24.003202]增加cookis={'httpOnly': True, 'name': 'JSESSIONID.c1e2fbc7', 'path': '/', 'secure': False, 'value': 'node09x8lb1jyt3ez9l9d01jyqq7j42.node0'}
- [2021-12-01 13:45:24.005148]保存cookie完毕
- [2021-12-01 13:45:24.005148]浏览器打开url=http://localhost:8080/
- [2021-12-01 13:45:24.155321]开始获取元素的文本,元素=xpath://div[@class='login']
- [2021-12-01 13:45:24.155321]定位元素,使用定位语句=xpath://div[@class='login']
- [2021-12-01 13:45:24.181251]完毕获取,文本= admin | 注销
- [2021-12-01 13:45:24.186238]结果:cookie有效
- [2021-12-01 13:45:26.200825]开始保存cookie到path=cookies.txt
- [2021-12-01 13:45:26.200825]增加cookis={'httpOnly': False, 'name': 'screenResolution', 'path': '/', 'secure': False, 'value': '800x600'}
- [2021-12-01 13:45:26.204822]增加cookis={'httpOnly': True, 'name': 'JSESSIONID.c1e2fbc7', 'path': '/', 'secure': False, 'value': 'node09x8lb1jyt3ez9l9d01jyqq7j42.node0'}
- [2021-12-01 13:45:26.207807]保存cookie完毕
- [2021-12-01 13:45:26.207807]浏览器打开url=http://localhost:8080/
- [2021-12-01 13:45:26.325493]在元素='css:a[href='/view/all/newJob']'上执行鼠标点击
- [2021-12-01 13:45:26.325493]定位元素,使用定位语句=css:a[href='/view/all/newJob']
- [2021-12-01 13:45:26.469110]在元素='id:name'上输入文本=场景3测试job
- [2021-12-01 13:45:26.469110]定位元素,使用定位语句=id:name
- [2021-12-01 13:45:26.549892]在元素='css:li[class='hudson_model_FreeStyleProject']'上执行鼠标点击
- [2021-12-01 13:45:26.549892]定位元素,使用定位语句=css:li[class='hudson_model_FreeStyleProject']
- [2021-12-01 13:45:26.584799]在元素='id:ok-button'上执行鼠标点击
- [2021-12-01 13:45:26.584799]定位元素,使用定位语句=id:ok-button
- [2021-12-01 13:45:27.228078]在元素='xpath://button[text()='保存']'上执行鼠标点击
- [2021-12-01 13:45:27.228078]定位元素,使用定位语句=xpath://button[text()='保存']
- [2021-12-01 13:45:27.470430]job=场景3测试job存在,url=http://localhost:8080/job/%E5%9C%BA%E6%99%AF3%E6%B5%8B%E8%AF%95job/
- [2021-12-01 13:45:27.470430]浏览器关闭当前窗口或tab
- [2021-12-01 13:45:27.523288]测试场景3结束
解说:
1.首先为什么要完善?因为之前的写法重跑会失败。
这次的测试场景很简单,在jenkins上创建一个名为"场景3测试job"的job,然后保存。但是之前实战012里写的脚本只能跑一次,再跑就会失败,因为跑完一次之后,就会创建出这个job,再重跑就会失败。
2.怎样解决重跑失败?跑之前删除同名job。
3.怎样删除同名job?调用jenkins 的rest api来删。
我之前就说了,一个脚本测一个场景。我用selenium测创建job的场景,这是因为我要测的是通过jenkins的图形界面创建一个job。而删除同名job只是这个测试场景的准备工作,准备工作完全没必要通过图形界面来做。因此,我通过调用jenkins rest api来做准备工作。
4.跑完之后怎么验证job是否创建成功了?调用jenkins 的rest api来验证。
同样道理,这个场景的验证也不需要通过图形界面来验证。
5.关于class Jenkins这个类。
设计了delete_job这个用于删job的方法和check_if_job_existed这个检查job是否存在的业务方法。
然后实现了jenkins的登陆鉴权。jenkins的鉴权是标准的http basic auth基础鉴权加上防止CSRF攻击的crumber issuer安全验证。在这个类里,要删除job,就要通过rest api的方式发送符合这两个机制要求的请求,调用才能成功。
另外,还把之前的登陆浏览器的方法login_jenkins也移动到了这个类里,因此场景2也要做一点小修改。但我相信读者可以自己改好,此处不再赘述。
最后,请读者注意体会场景3中的api和图形界面操作混合调用的做法及其意义。正因为有了这种混合操作,我们才可以在单个脚本里聚焦于单个脚本的业务逻辑,我们才可以抛弃以前传统的页面对象模式。因为页面对象模式里定义的服务毫无意义,这些服务我们直接用rest接口实现即可。传统页面对象中,页面=服务+元素。而经过上面的解释,页面对象的服务封装毫无意义。同理,页面对象的元素封装也毫无意义。因为在我的脚本化思路下编写的脚本,并不需要重用元素。
最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。