-前期准备
-环境
-实战: 从0开始
前期准备
为更好的学习自动化框架搭建,你需要提前了解以下知识:
python基础知识
pytest单元测试框架
PO模式
selenium使用
环境
本次我们自动化环境为:
mac+python3+selenium3+pytest==6.2.4
(不管是win还是mac,网上环境安装教程很多,参考下安装即可)
-实战: 从0开始
接下来我们以这个系统的登陆页面作为demo,开始进行web UI框架搭建:
最开始,我们设计了一个test_login.py文件,里完成了登陆脚本的设计:
from selenium.webdriver.support.ui import WebDriverWait
url = 'xx'
class TestLogin():
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get(url)
self.driver.maximize_window()
def teardown(self):
self.driver.close()
#以下为login页面设计的case
#case1:输入正确的用户名密码后页面跳转正常
def test_is_null(self,name,password):
self.driver.find_element(By.ID, 'user_name').send_keys(name)
self.driver.find_element(By.ID, 'password').send_keys(password)
self.driver.find_element(By.ID, 'submit-button').click()
assert 'user/index' in self.driver.get_url(),'failed--用户名密码正确时登陆场景失败'
print ('case pass')
# case2:用户名/密码不匹配
def test_not_match(self, name, password):
pass
写了1,2个用例时我们觉得没什么,但是随着case数量的增到,我们意识到了问题的严重性:
1.不同的case明明是同一段代码,只是传参不一致,就需要重复写多次,即便复制/粘贴也累啊—》解决:参数化,实现数据分离–创建data层
2.系统中某个页面发生变化,我准备去修改下对应的页面,结果代码写的过于分散,同一个页面的数据分散到了不同py模块,每次都修改不全,严重影响后期维护成本–》解决:引用PO模式(page object)–创建page层
3.系统中存在公共模块(比如系统中存在一个上传下载功能),多个页面/多个case都要使用—》解决:创建一个公共模块(创建public层)
……
诸如此类的问题随着case不断增多的状况下会明显感觉得到,接下来我们就开始逐一解决:
参数化(data):
利用pytest框架提供的@pytest.mark.parametrize()来实现,代码及页面接口设计如下:
读取json文件的代码:
import os
import json
current_path = os.path.abspath(__file__)
path = os.path.dirname(current_path)
def get_json_data(specifypath):
try:
parent_path = os.path.dirname(current_path)
path = f"{parent_path}/data/{specifypath}"
with open(path) as file:
data = json.load(file)
return data
except Exception as e:
print (e)
用例层调用data改造后的代码:
引用PO模式(page object):
po模式:
简单来说,就是以一个页面作为一个对象,把一个页面的内容写成一个.py文件;
这个页面对象中包含内容:当前页面的元素定位及 *** 作的整合;
po模式中会引用一个basepage.py,这个文件里面一般包含的是driver相关的 *** 作,比如:elements相关的改造,简单粗暴点理解:就是把self.driver.xx相关的内容都写到这里就行;其他页面都会继承basepage.py中的内容。
按照上面逻辑我们继续改造代码:
basepage.py:
login_page.py
我们看下case层怎么引用:
public层:
比如我登陆页面需要用到public中的内容,直接在login_page.py文件中继承即可使用public中的所有方法:
/以上就完成的框架设计/
框架设计核心:分层思想、PO模式
自动化框架设计一般都是设计都分为:page层、testcase层、public层、data层、report层(分层都比较灵活的,不管怎么分都是换汤不换药)
给大家看下完整的框架结构:
运行所有的case都放在这个run.sh的shell脚本里,后期做jenkins集成也只需要跑这个脚本即可:
echo 'start----------------'
pip install -r requirements.txt
pwd
pytest
echo 'end----------------'
关于report大家可以直接用pytest-html来实现,网上有很多教程参考;
后期做jenkins集成直接参考之前写的内容。
///done//
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)