-前期准备
-环境
-实战: 从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//

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐