当前位置: 首页 > news >正文

网站开发形式选择客户案例 网站设计

网站开发形式选择,客户案例 网站设计,百度怎么打广告,纪检网站建设目录#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结#xff08;尾部小惊喜#xff09; 前言 在开始前#xf… 目录导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结尾部小惊喜 前言 在开始前我们可以先思考几个问题动态切换测试环境的目的是什么能够解决什么问题该如何实现实现方案具体步骤是什么实现过程 1、动态切换测试环境的目的是什么 动态切换测试环境的目的是什么或者说它能解决什么样的问题 便于快速验证功能在不同环境中的表现。 比如有的功能背后的接口在开发环境是正常的但到了测试或预发布环境就出问题了可以便于快速验证各个功能在不同环境中的表现 省去修改配置参数的繁琐步骤。通常情况下我们的配置信息都是写在配置文件中然后测试用例读取配置文件中不同的配置信息。如果想要切换环境就需要修改配置文件或读取配置的逻辑。 而动态切换测试环境则可以自动根据我们传入的命令行参数和预制好的读取配置的策略自动识别、解析并返回对应的数据。 为测试框架赋能。测试框架要能做到一套脚本多环境运行支持环境切换并且能根据环境进行自动化的配置包括系统配置、测试数据配置等。 其实以上总结起来就是一套测试脚本能根据环境进行自动化的配置省去手动配置参数的步骤可以实现在多环境中运行从而快速验证各个接口及相关服务在不同环境中的表现。 2、动态切换测试环境如何实现 实现方案 我们希望可以有个开关自由控制执行脚本的运行环境而不是需要我们手动修改。 比如选择dev时自动读取的是开发环境的配置及测试数据url、数据库配置、账号密码、测试数据 当切换到test时自动读取的是测试环境的配置及测试数据。 大致实现原理如下所示 用户通过pytest命令行传入参数驱动脚本执行pytest_addoption用于实现自定义命令行参数 fixture函数get_env用于获取用户输入的命令行参数传递给fixture.py中的各个fixture函数 fixture.py中的各个fixture函数根据get_env提供的环境参数值解析测试环境对应的数据文件内容URL(get_url)、账号(get_user)、数据库配置(get_db)同时传递给api类(api_module_A…B…C)、登录方法(login)、数据库连接方法(use_db)等用于实例化操作这部分fixture函数再传递给测试用例用于用例前后置操作(相当于setup/teardown) 最后测试用例再根据各个fixture函数返回的实例对象、配置信息调用各个模块的api函数执行测试并读写数据库实现数据校验、断言从而最终实现切换环境策略 3、目录结构框架设计小技巧 目录结构 项目结构大致如下至于目录结构和文件命名只能说萝卜青菜各有所爱。比如有人喜欢把存放公共方法的common目录命名为utils存放各个api模块的api目录命名为src… 自动化测试框架设计小技巧 api存放封装各个项目、各个模块的api如jk项目支付模块可以命名为jk_pay.py config存放配置文件直接用py文件即可不推荐使用ini、yaml反而会多了一层解析增大出错概率 common存放公共方法如基于http协议requests库则可以命名为http_requests.py通过文件名称大概率就能知道这个文件的作用比如通过parse_excel的命名直接就能知道是解析excel文件 main框架主入口存放用来批量执行用例的文件比如run_testcase_by_tag.py(前提是用例都打了标签)、run_testcase_by_name.py fixture存放fixture文件建议每个项目一个fixture文件互不影响如jk_fixture.py、jc_fixture.py test_case存放测试用例文件 conftest.py存放一些hook函数、全局fixture函数如前面提到的自定义命令行参数的函数pytest_addoption、获取命令行参数的fixture函数get_env pytest.inipytest框架配置文件 4、实现过程 上述的方案单从文字层面可能有些难以理解下面我们结合具体的代码案例来详细讲述一下实现过程。 实现自定义命令行参数工具 在conftest.py中定义一个hook函数实现自定义命令行工具名为pytest_addoption(固定写法)用来在命令行中传入不同的环境参数 def pytest_addoption(parser):添加命令行参数parser.addoption为固定写法default 设置一个默认值此处设置默认值为testchoices 参数范围传入其他值无效help 帮助信息parser.addoption(--env, defaulttest, choices[dev, test, pre], helpenviroment parameter)定义获取命令行参数的fixture函数 在conftest.py中定义get_env的fixture函数用来获取用户在命令行输入的参数值传递给fixture.py中的各个fixture函数。pytestconfig是request.config的快捷方式所以request.config也可以写成pytestconfig。 pytest.fixture(scopesession) def get_env(request):return request.config.getoption(--env)来测试一下命令行能否输入参数以及fixture函数get_env能否获取到。我们可以简单定义一个测试用例 def test_env(get_env):print(fThe current environment is: {get_env})然后通过命令行执行此测试用例 pytest -s -v --env dev test_env.py::test_env执行结果如下 定义环境解析策略 例如当前项目为jc项目则可以在fixture目录下定义一个jc_fixture.py的文件用于专门存放此项目相关的fixture函数。 fixture.py中的各个fixture函数根据get_env提供的环境参数值解析测试环境对应的数据文件内容URL(get_url)、账号(get_user)、数据库配置(get_db)同时传递给api类(api_module_A…B…C)进行实例化登录方法(login)、数据库连接方法(use_db)等进行初始化这部分fixture函数再传递给测试用例用于用例前后置操作(相当于setup/teardown) import pytest from config.config import URLConf, PasswordConf, UsernameConf, ProductIDConf from api.jc_common import JCCommon from api.jc_resource import JCResource from config.db_config import DBConfig from common.mysql_handler import MySQLpytest.fixture(scopesession) def get_url(get_env):解析URLglobal urlif get_env test:print(当前环境为测试环境)url URLConf.RS_TEST_URL.valueelif get_env dev:print(当前环境为开发环境)url URLConf.RS_DEV_URL.valueelif get_env pre:print(当前环境为预发布环境)url URLConf.RS_PRE_URL.valuereturn urlpytest.fixture(scopesession) def get_user(get_env):解析登录用户global username_admin, username_boss# 若get_env获取到的是test则读取配置文件中测试环境的用户名if get_env test:username_admin UsernameConf.RS_TEST_ADMIN.valueusername_boss UsernameConf.RS_TEST_BOSS.value# 若get_env获取到的是dev则读取配置文件中开发环境的用户名elif get_env dev:username_admin UsernameConf.RS_TEST_ADMIN.valueusername_boss UsernameConf.RS_TEST_BOSS.value# 若get_env获取到的是pre则读取配置文件中预发布环境的用户名elif get_env pre:username_admin UsernameConf.RS_TEST_ADMIN.valueusername_boss UsernameConf.RS_TEST_BOSS.valuepytest.fixture(scopesession) def get_db(get_env):解析数据库配置global db_host, db_pwd, db_ssh_host, db_ssh_pwd, db_nameif get_env test:db_host DBConfig.db_test.get(host)db_pwd DBConfig.db_test.get(pwd)db_ssh_host DBConfig.db_test.get(ssh_host)db_ssh_pwd DBConfig.db_test.get(ssh_pwd)db_name DBConfig.db_test.get(dbname_jc)elif get_env dev:db_host DBConfig.db_test.get(host)db_pwd DBConfig.db_test.get(pwd)db_ssh_host DBConfig.db_test.get(ssh_host)db_ssh_pwd DBConfig.db_test.get(ssh_pwd)db_name DBConfig.db_test.get(dbname_jc)elif get_env pre:db_host DBConfig.db_test.get(host)db_pwd DBConfig.db_test.get(pwd)db_ssh_host DBConfig.db_test.get(ssh_host)db_ssh_pwd DBConfig.db_test.get(ssh_pwd)db_name DBConfig.db_test.get(dbname_jc)pytest.fixture(scopesession) def jc_common(get_env, get_url):传入解析到的URL、实例化jc项目公共接口类product_id ProductIDConf.JC_PRODUCT_ID.valuejc_common JCCommon(product_idproduct_id, urlget_url)return jc_commonpytest.fixture(scopesession) def jc_resource(get_env, get_url):传入解析到的URL、实例化jc项目测试接口类product_id ProductIDConf.JC_PRODUCT_ID.valuejc_resource JCResource(product_idproduct_id, urlget_url)return jc_resourcepytest.fixture(scopeclass) def rs_admin_login(get_user, jc_common):登录的fixture函数password PasswordConf.PASSWORD_MD5.valuelogin jc_common.login(usernameusername_shipper, passwordpassword)admin_user_id login[b]return admin_user_idpytest.fixture(scopeclass) def jc_get_admin_user_info(jc_common, jc_admin_login):获取用户信息的fixture函数user_info jc_common.get_user_info(user_idrs_shipper_login)admin_cpy_id user_info[d][b]return admin_cpy_idpytest.fixture(scopeclass) def use_db(get_db):链接数据库的fixture函数mysql MySQL(hostdb_host, pwddb_pwd, ssh_hostdb_ssh_host, ssh_pwddb_ssh_pwd, dbnamedb_name)yield mysqlmysql.disconnect()测试用例引用fixture 封装各个待测模块的api函数 登录模块jc_common.py from common.http_requests import HttpRequestsclass JcCommon(HttpRequests):def __init__(self, url, product_id):super(JcCommon, self).__init__(url)self.product_id product_iddef login(self, username, password):用户登录headers {product_id: str(self.product_id)}params {a: int(username), b: str(password)}response self.post(uri/userlogin, headersheaders, paramsparams)return responsedef get_user_info(self, uid, token):获取用户信息headers {user_id: str(uid), product_id: str(self.product_id), token: token}response self.post(uri/user/login/info, headersheaders)return response业务模块jc_resource.py import random from common.http_requests import HttpRequests from faker import Fakerclass RSResource(HttpRequests):def __init__(self, url, product_id):super(RSResource, self).__init__(url)self.product_id product_idself.faker Faker(localezh_CN)def add_goods(self, cpy_id, user_id, goods_name, goos_desc, goods_type, goos_price):新增商品headers {product_id: str(self.product_id), cpy_id: str(cpy_id), user_id: str(user_id)}params {a: goods_name, b: goos_desc, c: goods_type, d: goos_price}r self.post(uri/add/goods, paramsparams, headersheaders)return rdef modify_goods(self, cpy_id, user_id, goods_name, goos_desc, goods_type, goos_price):修改商品信息headers {product_id: str(self.product_id), cpy_id: str(cpy_id), user_id: str(user_id)}params {a: car_name, ab: car_id, b: company_id, c: car_or_gua}r self.post(uri/risun/res/car/add/blacklist?md065cmd006, paramsparams, headersheaders)return r各个模块的api函数作为独立的存在将配置与函数隔离且不涉及任何fixture的引用。这样无论测试URL、用户名、数据库怎么变换也无需修改待测模块的api函数基本可以做到一劳永逸除非接口地址和传参发生变化。 测试用例 JC项目的测试用例类TestJcSmoke根据各个jc_fixture.py中各个fixture函数返回的实例对象、配置信息调用各个业务模块的api函数执行测试并读写数据库实现数据校验、断言 import os import sys sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))) import allure from fixture.jc_fixture import * from common.parse_excel import ParseExcellogger LogGen(JC接口Smoke测试).getLog()allure.feature(JC项目接口冒烟测试) class TestJcSmoke:def setup_class(self):self.fake Faker(zh_CN)# 将fixture中的jc_resource实例、数据库实例、登录等fixture函数传递给测试用例进行调用pytest.mark.jc_smokeallure.story(商品管理)def test_01_goods_flow(self, jc_resource, jc_admin_login, jc_get_admin_user_info, use_db):测试商品增删改查接口user_id jc_admin_logincpy_id jc_get_admin_user_infogoods_name iphone 14pro max 512Gtry:logger.info(f新增{goods_name}商品)with allure.step(调用添加商品接口):add_goods jc_resource.add_goods(cpy_id, user_id, goods_name, goods_type1)assert add_goods[a] 200self.goods_id add_goods[d]select_db use_db.execute_sql(fSELECT * FROM goods_info WHERE company_id {cpy_id} AND id {self.goods_id}) # 查询数据库是否存在新增的数据assert goods_name in str(select_db)logger.info(f商品{goods_name}新增成功)logger.info(f修改{goods_name}的商品信息)with allure.step(调用修改商品接口):modify_goods jc_resource.modify_goods(cpy_id, user_id, goods_idself.goods_id, goods_namegoods_name, goods_type2)assert modify_goods[a] 200select_db use_db.execute_sql(fSELECT goodsType FROM goods_info WHERE company_id {cpy_id} AND id {self.goods_id})assert str(select_db[0]) 2logger.info(f修改{goods_name}的商品信息成功)logger.info(f开始删除商品{goods_name})with allure.step(调用删除商品接口):del_goods jc_resource.delete_goods(cpy_id, user_id, goods_idself.goods_id)assert del_goods[a] 200select_db use_db.execute_sql(fSELECT * FROM goods_info WHERE id {self.goods_id})print(select_db)logger.info(f删除商品{goods_name}成功)except AssertionError as e:logger.info(f商品流程测试失败)raise e在上述smoke测试用例test_01_goods_flow中同时验证了商品的增、改、删三个接口形成一个简短的业务流如果接口都是畅通的话则最后会删除商品无需再手动维护。 注意 上述模块接口及测试用例仅为演示使用非真实存在。 传统的测试用例设计模式中会把一些实例化放在setup或setup_class中如jc_resource JcResource(xxx)但因为fixture函数无法在前后置方法中传递的缘故所以要把一些实例化的操作放在fixture函数中进行并return一个内存地址直接传递给测试用例从而使测试用例能够调用到实例对象中的业务api。 5、运行项目 完成了命令行参数、解析策略、封装接口、测试用例编写后既可以直接在编辑器中点击运行按钮执行测试也可以在命令行驱动执行。以下演示命令行执行用例方法 -v打印详细执行过程 -s控制台输出用例中的print语句 –env前面pytest_addoption定义的命令行参数默认值test输入范围choices[“dev”, “test”, “pre”] 输入一个不存在的–env参数 pytest -v -s --env online test_jc_smoke.py此时会提示我们参数错误online为不可用选项。 运行测试环境 pytest -v -s --env test test_jc_smoke.py为了方便起见直接运行了现有项目的测试用例当传入test时会在测试环境运行。 一共12条测试用例全部运行通过 同时测试结果发送到企业微信群。 运行开发及预发布环境 pytest -v -s --env dev test_jc_smoke.py # 开发环境 pytest -v -s --env pre test_jc_smoke.py # 预发布环境dev、pre参数接收正常不过因为开发、预发布环境没启动的缘故所以执行失败。 6、Pytest实现一键切换环境方案原理小结 原理说明 测试环境变量由用户输入提供 测试框架定义测试数据解析函数并根据用户输入的测试变量解析并返回测试环境对应的数据文件内容 下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 一、Python编程入门到精通 二、接口自动化项目实战 三、Web自动化项目实战 四、App自动化项目实战 五、一线大厂简历 六、测试开发DevOps体系 七、常用自动化测试工具 八、JMeter性能测试 九、总结尾部小惊喜 只要朝着目标坚定前行努力不息困难会变得渺小成功将变得触手可及。不要追求一夜成名而是坚持积累与进步你一定能够创造出属于自己的辉煌相信自己勇敢拼搏未来由你决定 不管前方多漫长多曲折只要你有一颗不服输的心永不言弃的精神努力奋斗你就能找到属于自己的道路并取得成功。相信自己的能力坚持追逐梦想未来将为你绽放光芒 即使身处黑暗的时刻也要保持信念与毅力勇往直前坚定不移地追求梦想。每一次努力都是积累每一次坚持都是成长只要不停止奋斗成功的曙光终将到来相信自己敢于冒险创造属于自己的辉煌加油
http://www.zqtcl.cn/news/250610/

相关文章:

  • 建湖专业做网站的公司如何制作wordpress网站地图
  • 做自媒体查找素材的网站石家庄网站建设费用
  • 建立局域网网站怎么做外国网站
  • 绍兴专业网站建设公司网站seo设计
  • 开发网站需要多久建设银行招聘网站
  • 靖江 建设局网站安阳做网站的公司有哪些
  • 网站title在哪里用discuz做的门户网站
  • 郑州定制网站推广工具产品网络舆情管理
  • 个人网站的建设方法和过程七牛云存储代替WordPress
  • 网站应用网站开发android开发工具有哪些
  • 农业信息门户网站建设方案教做糕点的网站
  • 网站上的分享手机网站免费建设平台
  • 有哪个网站专业做漫画素材的wordpress显示问题
  • 网站开发工程师月薪网站网页设计培训机构
  • 专业网站运营备案名称网站名称
  • 盐城市建设局网站企业网站建设流程与方法 论文
  • 青岛信息推广网站营销自己的网站
  • wp博客 婚庆网站模板摄影网页面制作
  • 大型商城网站建设学计算机前端好就业吗
  • 杭州 电子商务网站建设专门做酒店自助餐的网站
  • 如何备份网站数据库网站用户体验模型
  • 网站域名注册流程办公室装修风格
  • a站免费最好看的电影片推荐方正隶变简体可以做网站用么
  • 创同盟做网站找公司做网站需要咨询什么问题
  • 西安行业网站株洲高端网站建设
  • 优化网站流量商城网站建设软件
  • dw属于什么的网页制作工具网络建站优化科技
  • 百度网站首页的设计理念南京高新区规划建设局网站
  • 虚拟机做实验的网站网站以个人名义备案
  • 自定义表单网站网站建设营销型号的区别