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

企业级定制化项目自动化测试框架

企业级定制化项目自动化测试框架(Python+Playwright+Pytest+Requests+LangChain)

框架定位

针对多项目、多工具、质量参差不齐、定制化需求的软件定制化开发场景,设计一套可插拔、可配置、支持UI/API/E2E全类型测试、AI智能辅助的自动化测试框架。

核心优势:

  1. 项目隔离:多项目独立配置,互不干扰
  2. 全类型覆盖:API接口、UI自动化、端到端E2E一体化
  3. AI赋能:LangChain智能生成测试用例/自动排查失败原因
  4. 高可配置:支持不同质量标准、不同测试工具灵活切换
  5. 企业级报告:全量可视化测试报告,支持定制化输出

一、框架目录结构(标准工程化)

automation-test-framework/ ├── config/ # 全局+项目配置 │ ├── global_config.py # 全局配置(浏览器、超时、环境) │ └── projects/ # 各项目独立配置(项目A、项目B...) ├── core/ # 框架核心层 │ ├── api_client.py # Requests封装 API请求基类 │ ├── browser_engine.py # Playwright封装 浏览器驱动 │ └── ai_assistant.py # LangChain AI智能测试助手 ├── tests/ # 测试用例层 │ ├── api/ # API接口测试用例 │ ├── ui/ # UI自动化测试用例 │ └── e2e/ # 端到端E2E测试用例 ├── pages/ # PO模式 UI页面对象层 ├── utils/ # 工具类 │ ├── logger.py # 日志工具 │ └── report_helper.py # 报告生成工具 ├── conftest.py # Pytest夹具、钩子函数 ├── pytest.ini # Pytest配置 └── requirements.txt # 依赖包

二、依赖安装(requirements.txt)

pytest>=7.4.0 playwright>=1.40.0 requests>=2.31.0 langchain>=0.1.0 langchain-openai>=0.0.2 allure-pytest>=2.13.0 python-dotenv>=1.0.0 loguru>=0.7.2 pydantic>=2.0.0

安装命令

pipinstall-rrequirements.txt playwrightinstall# 安装浏览器驱动

三、核心代码实现

1. 配置层(支持多项目隔离)

config/global_config.py全局配置
importosfromdotenvimportload_dotenv# 加载环境变量load_dotenv()classGlobalConfig:# 基础配置PROJECT_NAME=os.getenv("PROJECT_NAME","default_project")ENV=os.getenv("TEST_ENV","test")# test/prod/devTIMEOUT=int(os.getenv("TIMEOUT",30000))# Playwright配置BROWSER_TYPE=os.getenv("BROWSER_TYPE","chromium")# chromium/firefox/webkitHEADLESS=os.getenv("HEADLESS","False").lower()=="true"VIDEO_SAVE_PATH="./reports/videos/"SCREENSHOT_SAVE_PATH="./reports/screenshots/"# API配置API_TIMEOUT=int(os.getenv("API_TIMEOUT",60))# AI配置AI_API_KEY=os.getenv("AI_API_KEY")AI_BASE_URL=os.getenv("AI_BASE_URL")# 实例化全局配置config=GlobalConfig()
config/projects/project_a_config.py项目独立配置
fromconfig.global_configimportconfigclassProjectAConfig:# 项目独立地址UI_BASE_URL="https://demo-project-a.com"API_BASE_URL="https://api-demo-project-a.com"# 项目登录信息LOGIN_USER="admin"LOGIN_PWD="123456"# 继承全局配置global_config=config

2. 框架核心层

core/browser_engine.pyPlaywright浏览器引擎封装
fromplaywright.sync_apiimportsync_playwright,Browser,Pagefromconfig.global_configimportconfigfromloguruimportloggerimportosclassBrowserEngine:def__init__(self):self.playwright=Noneself.browser=Noneself.page=Noneself.context=Nonedefinit_browser(self):"""初始化浏览器"""self.playwright=sync_playwright().start()# 根据配置选择浏览器ifconfig.BROWSER_TYPE=="chromium":self.browser=self.playwright.chromium.launch(headless=config.HEADLESS,slow_mo=500# 减慢操作速度,适配定制化系统)elifconfig.BROWSER_TYPE=="firefox":self.browser=self.playwright.firefox.launch(headless=config.HEADLESS)# 创建上下文(支持多标签页、视频录制)self.context=self.browser.new_context(record_video_dir=config.VIDEO_SAVE_PATH,record_video_size={"width":1920,"height":1080})self.page=self.context.new_page()self.page.set_default_timeout(config.TIMEOUT)logger.info(f"浏览器初始化完成:{config.BROWSER_TYPE}")returnself.pagedefscreenshot(self,name:str):"""截图保存"""os.makedirs(config.SCREENSHOT_SAVE_PATH,exist_ok=True)path=f"{config.SCREENSHOT_SAVE_PATH}{name}.png"self.page.screenshot(path=path,full_page=True)logger.info(f"截图已保存:{path}")defquit_browser(self):"""关闭浏览器"""ifself.context:self.context.close()ifself.browser:self.browser.close()ifself.playwright:self.playwright.stop()logger.info("浏览器已关闭")
core/api_client.pyRequests API客户端封装
importrequestsfromconfig.global_configimportconfigfromloguruimportloggerclassAPIClient:def__init__(self,base_url:str):self.base_url=base_url self.session=requests.Session()self.session.timeout=config.API_TIMEOUT# 全局请求头self.session.headers.update({"Content-Type":"application/json;charset=UTF-8","User-Agent":"AutomationTestFramework"})defget(self,url:str,params=None,headers=None):"""GET请求"""full_url=self.base_url+url logger.info(f"GET请求:{full_url},参数:{params}")response=self.session.get(full_url,params=params,headers=headers)returnself._response_handler(response)defpost(self,url:str,data=None,json=None,headers=None):"""POST请求"""full_url=self.base_url+url logger.info(f"POST请求:{full_url},数据:{json}")response=self.session.post(full_url,data=data,json=json,headers=headers)returnself._response_handler(response)def_response_handler(self,response):"""响应结果处理"""try:res_json=response.json()logger.info(f"响应结果:{res_json}")return{"status_code":response.status_code,"data":res_json,"response":response}except:logger.error(f"非JSON响应:{response.text}")return{"status_code":response.status_code,"text":response.text,"response":response}
core/ai_assistant.pyLangChain AI测试助手(核心亮点)
fromlangchain_openaiimportChatOpenAIfromlangchain.schemaimportHumanMessage,SystemMessagefromconfig.global_configimportconfigfromloguruimportloggerclassAITestAssistant:def__init__(self):ifnotconfig.AI_API_KEY:logger.warning("未配置AI密钥,禁用AI功能")self.llm=Nonereturn# 初始化大模型self.llm=ChatOpenAI(api_key=config.AI_API_KEY,base_url=config.AI_BASE_URL,temperature=0.3,model="gpt-3.5-turbo")defgenerate_test_cases(self,function_desc:str):"""AI根据功能描述生成测试用例"""ifnotself.llm:return"AI功能未启用"prompt=f""" 你是专业测试专家,根据以下功能描述,生成标准测试用例: 功能描述:{function_desc}输出格式:用例编号|用例标题|前置条件|操作步骤|预期结果 """messages=[SystemMessage(content="你是企业级软件测试专家,擅长定制化系统测试"),HumanMessage(content=prompt)]result=self.llm.invoke(messages)returnresult.contentdefanalyze_test_failure(self,error_log:str):"""AI自动分析测试失败原因"""ifnotself.llm:return"AI功能未启用"prompt=f""" 自动化测试失败,错误日志如下:{error_log}请分析:1.失败原因 2.可能的解决方案 3.是否是Bug """messages=[HumanMessage(content=prompt)]result=self.llm.invoke(messages)returnresult.content

3. PO模式页面对象层(pages)

fromconfig.projects.project_a_configimportProjectAConfigfromloguruimportloggerclassLoginPage:def__init__(self,page):self.page=page self.base_url=ProjectAConfig.UI_BASE_URL# 页面元素(Playwright定位器)self.username_input=page.locator("#username")self.password_input=page.locator("#password")self.login_btn=page.locator("#login-btn")defopen(self):"""打开登录页面"""self.page.goto(f"{self.base_url}/login")logger.info("打开登录页面")returnselfdefinput_account(self,username=None,password=None):"""输入账号密码"""user=usernameorProjectAConfig.LOGIN_USER pwd=passwordorProjectAConfig.LOGIN_PWD self.username_input.fill(user)self.password_input.fill(pwd)logger.info(f"输入账号:{user}")returnselfdefclick_login(self):"""点击登录"""self.login_btn.click()self.page.wait_for_timeout(2000)logger.info("点击登录按钮")returnself

4. Pytest夹具(conftest.py)

importpytestfromcore.browser_engineimportBrowserEnginefromcore.api_clientimportAPIClientfromcore.ai_assistantimportAITestAssistantfromconfig.projects.project_a_configimportProjectAConfigfromloguruimportloggerimportallure# 全局夹具 - UI测试@pytest.fixture(scope="class")defpage():browser=BrowserEngine()page=browser.init_browser()yieldpage browser.quit_browser()# 全局夹具 - API测试@pytest.fixture(scope="class")defapi_client():client=APIClient(ProjectAConfig.API_BASE_URL)yieldclient# 全局夹具 - AI助手@pytest.fixture(scope="session")defai_assistant():returnAITestAssistant()# 失败自动截图@pytest.hookimpl(tryfirst=True,hookwrapper=True)defpytest_runtest_makereport(item,call):outcome=yieldreport=outcome.get_result()ifreport.when=="call"andreport.failed:page=item.funcargs.get("page")ifpage:name=item.name+"_failed"page.screenshot(path=f"./reports/screenshots/{name}.png")allure.attach.file(f"./reports/screenshots/{name}.png",name="失败截图",attachment_type=allure.attachment_type.PNG)

5. 测试用例层(一体化示例)

5.1 API测试用例(tests/api/test_login_api.py)
importpytestimportallure@allure.feature("登录接口")classTestLoginAPI:@allure.story("正常登录")deftest_login_success(self,api_client):data={"username":"admin","password":"123456"}res=api_client.post("/user/login",json=data)assertres["status_code"]==200assertres["data"]["code"]==0@allure.story("AI生成登录接口测试用例")deftest_ai_generate_cases(self,ai_assistant):cases=ai_assistant.generate_test_cases("用户登录接口,账号密码验证")print("\nAI生成的测试用例:\n",cases)
5.2 UI测试用例(tests/ui/test_login_ui.py)
importpytestimportallurefrompages.login_pageimportLoginPage@allure.feature("登录UI")classTestLoginUI:@allure.story("UI登录成功")deftest_login_ui_success(self,page):login=LoginPage(page)login.open().input_account().click_login()# 断言登录成功assertpage.locator(".user-info").is_visible()@allure.story("AI分析失败用例")deftest_ai_analyze_failure(self,ai_assistant):error="元素#login-btn未找到,超时30s"result=ai_assistant.analyze_test_failure(error)print("\nAI失败分析:\n",result)
5.3 E2E端到端测试用例(tests/e2e/test_login_e2e.py)
importpytestimportallure@allure.feature("E2E登录流程")classTestLoginE2E:@allure.story("API+UI一体化E2E测试")deftest_login_e2e(self,api_client,page):# 1. API获取登录凭证api_res=api_client.post("/user/login",json={"username":"admin","password":"123456"})token=api_res["data"]["token"]# 2. UI登录验证page.set_extra_http_headers({"Authorization":f"Bearer{token}"})page.goto("https://demo-project-a.com/home")assertpage.locator(".welcome").is_visible()

6. Pytest配置(pytest.ini)

[pytest] testpaths = tests python_files = test_*.py python_classes = Test* python_functions = test_* addopts = -vs --alluredir=./reports/allure-results --clean-alluredir log_cli = true log_cli_level = INFO

四、框架运行与报告

1. 运行命令

# 运行所有用例pytest# 只运行API测试pytest tests/api/# 只运行UI测试pytest tests/ui/# 只运行E2E测试pytest tests/e2e/

2. 生成Allure可视化报告

allure serve ./reports/allure-results

五、适配多项目/多质量标准的扩展方案

  1. 多项目切换

    • 新建config/projects/project_b_config.py
    • 修改.envPROJECT_NAME=project_b
    • 框架自动加载对应项目配置
  2. 不同质量标准适配

    • 高要求项目:开启视频录制、全量断言、AI自动分析
    • 低要求项目:关闭视频、简化断言、快速冒烟
  3. 不同工具兼容

    • 接口测试:可无缝切换RestAssured/HttpClient
    • UI测试:支持Chromium/Firefox/webkit三浏览器

六、框架核心价值(针对定制化开发场景)

  1. 解决质量参差不齐:统一测试标准,自动校验质量
  2. 解决多项目混乱:项目完全隔离,配置化驱动
  3. 解决效率问题:UI+API+E2E一体化,一次编写多项目复用
  4. 解决人工成本:AI自动生成用例、自动分析失败
  5. 解决交付风险:全量自动化报告,可视化质量数据

总结

我为你打造了一套完全适配企业定制化软件开发场景Python+Playwright+Pytest+Requests+LangChain全功能自动化测试框架,具备:

  1. 三层架构(配置层+核心层+用例层),低耦合、高复用
  2. 全类型覆盖:API、UI、E2E一体化测试
  3. AI智能赋能:自动生成用例、自动分析失败
  4. 多项目适配:完美解决定制化项目质量参差不齐、工具不统一问题
  5. 企业级报告:Allure可视化,支持交付输出

可以直接复制代码使用,我可以继续为你扩展更多项目模板、优化AI能力、对接CI/CD流水线

http://www.jsqmd.com/news/714104/

相关文章:

  • 2026年银川高端系统门窗选购指南:派雅门窗与行业主流品牌深度横评 - 精选优质企业推荐官
  • Java 25密封类模式实战:20年老炮儿压箱底的「密封域建模七律」,仅限首批200名开发者获取的架构审查Checklist
  • 极空间NAS开启SSH:解锁底层权限,从存储盒变成全能私有服务器
  • OpCore Simplify完整指南:如何3小时搞定黑苹果EFI配置
  • 学Simulink——基于Simulink的ZVS/ZCS软开关无线充电逆变器控制
  • 单词的音节划分规则,一个音节包含几种形式
  • 2026年目前雷达塔源头厂家,雷达塔/雷达塔信号塔/雷达塔监测塔,雷达塔实力厂家口碑推荐 - 品牌推荐师
  • 智能吹扫装置:工业清洁的未来解决方案
  • 如何5分钟快速搭建微信机器人:WechatBot完整入门教程
  • xdotool终极指南:Linux桌面自动化的完整解决方案
  • Cursor Pro破解工具完整指南:三步激活方案实现永久免费使用
  • 从周杰伦到久石让:拆解流行与影视配乐中,大三和弦与小三和弦的‘情绪开关’实战用法
  • STC/STM32单片机做R2R DAC?小心这个‘隐形杀手’让你的精度大打折扣
  • 50万节点Abaqus模型如何导入Unity?我用Python解析INP文件重构了数字孪生体
  • 3分钟精通Linux键盘音效软件Keysound:让你的打字变成钢琴演奏
  • ChanlunX缠论插件:通达信上的专业缠论分析终极指南
  • NVIDIA Profile Inspector终极教程:解锁显卡隐藏性能的完整指南
  • 九三架构及具体应用案例
  • 保姆级教程:解决Ubuntu 20.04在VMware 16里无法复制粘贴和全屏的问题(附共享文件夹设置)
  • 保姆级避坑指南:在树莓派4B上为Pixhawk搭建MAVROS通信环境(Ubuntu 20.04 + ROS Noetic)
  • ChanlunX缠论插件:如何让通达信用户5分钟实现专业级技术分析
  • UniExtract2:500+格式全能解压神器,告别格式困扰的终极解决方案
  • 2026冷库安装公司推荐:精选优质服务商,打造高效节能冷链新标杆 - 品牌2025
  • 终极内存故障排查指南:Memtest86+ 完整实战方案
  • KMS激活神器:3分钟免费激活Windows和Office的终极解决方案
  • 浏览器音乐解密神器:Unlock-Music完整使用教程
  • Source Han Serif CN:免费开源中文字体的7种粗细样式完全解析
  • 离线IP数据库推荐:风控合规场景怎么选
  • 2026年罗田、黄冈本地相亲平台推荐,专业靠谱机构排名出炉 - 工业品网
  • 四川成都非医院心理咨询机构盘点(2026年4月) - 野榜数据排行