Python自动化测试完整教程:pytest + selenium实战

目录

  1. 前言
  2. 环境搭建
  3. pytest基础教程
  4. selenium基础教程
  5. pytest + selenium实战项目
  6. 页面对象模式(POM)
  7. 测试报告生成
  8. 持续集成配置
  9. 最佳实践和进阶技巧
  10. 总结

前言

自动化测试是现代软件开发中不可或缺的一环。Python作为一门简洁优雅的编程语言,配合pytest测试框架和selenium自动化工具,为我们提供了强大的自动化测试解决方案。

本教程将从零开始,带领大家掌握Python自动化测试的核心技能,通过实战项目学会如何构建稳定、高效的自动化测试体系。

环境搭建

安装Python和依赖包

# 创建虚拟环境
python -m venv test_env
source test_env/bin/activate  # Windows: test_env\Scripts\activate# 安装核心依赖
pip install pytest selenium webdriver-manager pytest-html allure-pytest

浏览器驱动配置

# 使用webdriver-manager自动管理驱动
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.chrome.service import Servicedef setup_driver():service = Service(ChromeDriverManager().install())driver = webdriver.Chrome(service=service)return driver

项目结构搭建

automation_project/
├── tests/
│   ├── __init__.py
│   ├── test_login.py
│   └── test_search.py
├── pages/
│   ├── __init__.py
│   ├── base_page.py
│   └── login_page.py
├── utils/
│   ├── __init__.py
│   └── config.py
├── drivers/
├── reports/
├── conftest.py
├── pytest.ini
└── requirements.txt

pytest基础教程

pytest核心概念

pytest是Python中最流行的测试框架,具有以下特点:

  • 简单易用的断言语法
  • 丰富的插件生态系统
  • 强大的fixture机制
  • 灵活的测试发现和执行

基础测试示例

# test_basic.py
import pytestdef test_simple_assert():"""基础断言测试"""assert 1 + 1 == 2def test_string_operations():"""字符串操作测试"""text = "Hello, World!"assert "Hello" in textassert text.startswith("Hello")assert text.endswith("!")class TestCalculator:"""测试类示例"""def test_addition(self):assert 2 + 3 == 5def test_division(self):assert 10 / 2 == 5def test_division_by_zero(self):with pytest.raises(ZeroDivisionError):10 / 0

fixture机制深入

# conftest.py
import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager@pytest.fixture(scope="session")
def driver():"""会话级别的浏览器驱动"""options = webdriver.ChromeOptions()options.add_argument("--headless")  # 无头模式driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)yield driverdriver.quit()@pytest.fixture
def test_data():"""测试数据fixture"""return {"username": "test@example.com","password": "password123"}

参数化测试

# test_parametrize.py
import pytest@pytest.mark.parametrize("a,b,expected", [(2, 3, 5),(1, 1, 2),(0, 5, 5),(-1, 1, 0)
])
def test_addition(a, b, expected):assert a + b == expected@pytest.mark.parametrize("url", ["https://www.baidu.com","https://www.google.com"
])
def test_website_accessibility(driver, url):driver.get(url)assert driver.title

selenium基础教程

元素定位策略

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECclass ElementLocator:"""元素定位封装类"""def __init__(self, driver):self.driver = driverself.wait = WebDriverWait(driver, 10)def find_element_safely(self, locator):"""安全查找元素"""try:element = self.wait.until(EC.presence_of_element_located(locator))return elementexcept TimeoutException:print(f"元素定位失败: {locator}")return Nonedef click_element(self, locator):"""点击元素"""element = self.wait.until(EC.element_to_be_clickable(locator))element.click()def input_text(self, locator, text):"""输入文本"""element = self.find_element_safely(locator)if element:element.clear()element.send_keys(text)

常用操作封装

# utils/selenium_helper.py
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keysclass SeleniumHelper:"""Selenium操作助手类"""def __init__(self, driver):self.driver = driverdef scroll_to_element(self, element):"""滚动到指定元素"""self.driver.execute_script("arguments[0].scrollIntoView();", element)def select_dropdown_by_text(self, locator, text):"""通过文本选择下拉框"""select = Select(self.driver.find_element(*locator))select.select_by_visible_text(text)def hover_element(self, element):"""鼠标悬停"""actions = ActionChains(self.driver)actions.move_to_element(element).perform()def switch_to_iframe(self, iframe_locator):"""切换到iframe"""iframe = self.driver.find_element(*iframe_locator)self.driver.switch_to.frame(iframe)def take_screenshot(self, filename):"""截图"""self.driver.save_screenshot(f"screenshots/{filename}")

pytest + selenium实战项目

实战项目:电商网站测试

让我们以一个电商网站为例,构建完整的自动化测试项目。

配置文件设置
# utils/config.py
class Config:"""测试配置类"""BASE_URL = "https://example-shop.com"TIMEOUT = 10BROWSER = "chrome"HEADLESS = False# 测试账户信息TEST_USER = {"email": "test@example.com","password": "password123"}# 测试数据TEST_PRODUCT = {"name": "iPhone 14","price": "999.99"}
基础页面类
# pages/base_page.py
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Byclass BasePage:"""基础页面类"""def __init__(self, driver):self.driver = driverself.wait = WebDriverWait(driver, 10)def open(self, url):"""打开页面"""self.driver.get(url)def find_element(self, locator):"""查找元素"""return self.wait.until(EC.presence_of_element_located(locator))def click(self, locator):"""点击元素"""element = self.wait.until(EC.element_to_be_clickable(locator))element.click()def input_text(self, locator, text):"""输入文本"""element = self.find_element(locator)element.clear()element.send_keys(text)def get_text(self, locator):"""获取元素文本"""element = self.find_element(locator)return element.textdef is_element_visible(self, locator):"""检查元素是否可见"""try:self.wait.until(EC.visibility_of_element_located(locator))return Trueexcept:return False
登录页面类
# pages/login_page.py
from selenium.webdriver.common.by import By
from pages.base_page import BasePageclass LoginPage(BasePage):"""登录页面"""# 页面元素定位EMAIL_INPUT = (By.ID, "email")PASSWORD_INPUT = (By.ID, "password")LOGIN_BUTTON = (By.XPATH, "//button[@type='submit']")ERROR_MESSAGE = (By.CLASS_NAME, "error-message")SUCCESS_MESSAGE = (By.CLASS_NAME, "success-message")def login(self, email, password):"""执行登录操作"""self.input_text(self.EMAIL_INPUT, email)self.input_text(self.PASSWORD_INPUT, password)self.click(self.LOGIN_BUTTON)def get_error_message(self):"""获取错误信息"""if self.is_element_visible(self.ERROR_MESSAGE):return self.get_text(self.ERROR_MESSAGE)return Nonedef is_login_successful(self):"""检查登录是否成功"""return self.is_element_visible(self.SUCCESS_MESSAGE)
登录测试用例
# tests/test_login.py
import pytest
from pages.login_page import LoginPage
from utils.config import Configclass TestLogin:"""登录功能测试类"""@pytest.fixture(autouse=True)def setup(self, driver):"""测试前置条件"""self.driver = driverself.login_page = LoginPage(driver)self.login_page.open(f"{Config.BASE_URL}/login")def test_valid_login(self):"""测试有效登录"""self.login_page.login(Config.TEST_USER["email"],Config.TEST_USER["password"])assert self.login_page.is_login_successful()@pytest.mark.parametrize("email,password,expected_error", [("", "password123", "邮箱不能为空"),("invalid-email", "password123", "邮箱格式不正确"),("test@example.com", "", "密码不能为空"),("wrong@example.com", "wrongpass", "用户名或密码错误")])def test_invalid_login(self, email, password, expected_error):"""测试无效登录"""self.login_page.login(email, password)error_message = self.login_page.get_error_message()assert expected_error in error_messagedef test_login_form_elements(self):"""测试登录表单元素存在性"""assert self.login_page.is_element_visible(self.login_page.EMAIL_INPUT)assert self.login_page.is_element_visible(self.login_page.PASSWORD_INPUT)assert self.login_page.is_element_visible(self.login_page.LOGIN_BUTTON)

商品搜索测试

# pages/search_page.py
from selenium.webdriver.common.by import By
from pages.base_page import BasePageclass SearchPage(BasePage):"""搜索页面"""SEARCH_INPUT = (By.NAME, "search")SEARCH_BUTTON = (By.CLASS_NAME, "search-btn")SEARCH_RESULTS = (By.CLASS_NAME, "product-item")NO_RESULTS_MESSAGE = (By.CLASS_NAME, "no-results")PRODUCT_TITLE = (By.CLASS_NAME, "product-title")def search_product(self, keyword):"""搜索商品"""self.input_text(self.SEARCH_INPUT, keyword)self.click(self.SEARCH_BUTTON)def get_search_results_count(self):"""获取搜索结果数量"""results = self.driver.find_elements(*self.SEARCH_RESULTS)return len(results)def get_first_product_title(self):"""获取第一个商品标题"""return self.get_text(self.PRODUCT_TITLE)# tests/test_search.py
import pytest
from pages.search_page import SearchPage
from utils.config import Configclass TestSearch:"""搜索功能测试类"""@pytest.fixture(autouse=True)def setup(self, driver):self.driver = driverself.search_page = SearchPage(driver)self.search_page.open(Config.BASE_URL)def test_valid_search(self):"""测试有效搜索"""self.search_page.search_product("iPhone")assert self.search_page.get_search_results_count() > 0def test_search_no_results(self):"""测试无结果搜索"""self.search_page.search_product("不存在的商品")assert self.search_page.is_element_visible(self.search_page.NO_RESULTS_MESSAGE)@pytest.mark.parametrize("keyword", ["iPhone", "Samsung", "小米", "华为"])def test_multiple_searches(self, keyword):"""测试多个关键词搜索"""self.search_page.search_product(keyword)results_count = self.search_page.get_search_results_count()assert results_count >= 0  # 至少返回0个结果

页面对象模式(POM)

页面对象模式是自动化测试中的重要设计模式,它将页面元素和操作封装在独立的类中。

完整的POM实现

# pages/product_page.py
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from pages.base_page import BasePageclass ProductPage(BasePage):"""商品详情页"""# 商品信息元素PRODUCT_TITLE = (By.H1, "product-title")PRODUCT_PRICE = (By.CLASS_NAME, "price")PRODUCT_DESCRIPTION = (By.CLASS_NAME, "description")# 购买相关元素QUANTITY_SELECT = (By.NAME, "quantity")ADD_TO_CART_BUTTON = (By.ID, "add-to-cart")CART_SUCCESS_MESSAGE = (By.CLASS_NAME, "cart-success")# 评论相关元素REVIEWS_SECTION = (By.ID, "reviews")REVIEW_INPUT = (By.NAME, "review")SUBMIT_REVIEW_BUTTON = (By.ID, "submit-review")def get_product_info(self):"""获取商品信息"""return {"title": self.get_text(self.PRODUCT_TITLE),"price": self.get_text(self.PRODUCT_PRICE),"description": self.get_text(self.PRODUCT_DESCRIPTION)}def add_to_cart(self, quantity=1):"""添加到购物车"""# 选择数量quantity_select = Select(self.find_element(self.QUANTITY_SELECT))quantity_select.select_by_value(str(quantity))# 点击添加到购物车self.click(self.ADD_TO_CART_BUTTON)# 等待成功消息return self.is_element_visible(self.CART_SUCCESS_MESSAGE)def submit_review(self, review_text):"""提交评论"""self.input_text(self.REVIEW_INPUT, review_text)self.click(self.SUBMIT_REVIEW_BUTTON)

购物车页面测试

# tests/test_cart.py
import pytest
from pages.product_page import ProductPage
from pages.cart_page import CartPage
from utils.config import Configclass TestShoppingCart:"""购物车功能测试"""@pytest.fixture(autouse=True)def setup(self, driver):self.driver = driverself.product_page = ProductPage(driver)self.cart_page = CartPage(driver)def test_add_single_product_to_cart(self):"""测试添加单个商品到购物车"""# 打开商品页面self.product_page.open(f"{Config.BASE_URL}/product/1")# 添加到购物车success = self.product_page.add_to_cart(quantity=1)assert success# 验证购物车self.cart_page.open(f"{Config.BASE_URL}/cart")assert self.cart_page.get_cart_items_count() == 1def test_add_multiple_quantities(self):"""测试添加多数量商品"""self.product_page.open(f"{Config.BASE_URL}/product/1")success = self.product_page.add_to_cart(quantity=3)assert successself.cart_page.open(f"{Config.BASE_URL}/cart")total_quantity = self.cart_page.get_total_quantity()assert total_quantity == 3def test_cart_total_calculation(self):"""测试购物车总价计算"""# 添加多个商品products = [{"id": 1, "quantity": 2, "price": 99.99},{"id": 2, "quantity": 1, "price": 149.99}]expected_total = 0for product in products:self.product_page.open(f"{Config.BASE_URL}/product/{product['id']}")self.product_page.add_to_cart(product["quantity"])expected_total += product["price"] * product["quantity"]self.cart_page.open(f"{Config.BASE_URL}/cart")actual_total = self.cart_page.get_total_price()assert actual_total == expected_total

测试报告生成

HTML报告配置

# pytest.ini
[tool:pytest]
minversion = 6.0
addopts = -v --strict-markers --html=reports/report.html --self-contained-html
testpaths = tests
python_files = test_*.py
python_classes = Test*
python_functions = test_*
markers =smoke: 冒烟测试regression: 回归测试slow: 慢速测试

Allure报告集成

# conftest.py 添加allure配置
import allure
import pytest
from selenium import webdriver@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):"""生成测试报告钩子"""outcome = yieldreport = outcome.get_result()if report.when == "call" and report.failed:# 测试失败时自动截图driver = item.funcargs.get('driver')if driver:allure.attach(driver.get_screenshot_as_png(),name="失败截图",attachment_type=allure.attachment_type.PNG)# 在测试中使用allure装饰器
import allureclass TestLoginWithAllure:"""带Allure报告的登录测试"""@allure.epic("用户管理")@allure.feature("用户登录")@allure.story("正常登录流程")@allure.severity(allure.severity_level.CRITICAL)def test_valid_login_with_allure(self, driver):"""测试有效登录 - Allure版本"""with allure.step("打开登录页面"):login_page = LoginPage(driver)login_page.open(f"{Config.BASE_URL}/login")with allure.step("输入登录凭证"):login_page.login(Config.TEST_USER["email"],Config.TEST_USER["password"])with allure.step("验证登录结果"):assert login_page.is_login_successful()allure.attach(driver.get_screenshot_as_png(),name="登录成功截图",attachment_type=allure.attachment_type.PNG)

持续集成配置

GitHub Actions配置

# .github/workflows/test.yml
name: 自动化测试on:push:branches: [ main, develop ]pull_request:branches: [ main ]jobs:test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- name: 设置Python环境uses: actions/setup-python@v3with:python-version: '3.9'- name: 安装Chromeuses: browser-actions/setup-chrome@latest- name: 安装依赖run: |python -m pip install --upgrade pippip install -r requirements.txt- name: 运行测试run: |pytest tests/ --html=reports/report.html --alluredir=allure-results- name: 生成Allure报告uses: simple-elf/allure-report-action@masterif: always()with:allure_results: allure-resultsallure_history: allure-history- name: 上传测试报告uses: actions/upload-artifact@v3if: always()with:name: test-reportspath: |reports/allure-report/

Docker配置

# Dockerfile
FROM python:3.9-slim# 安装系统依赖
RUN apt-get update && apt-get install -y \wget \gnupg \unzip \curl# 安装Chrome
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \&& echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \&& apt-get update \&& apt-get install -y google-chrome-stable# 设置工作目录
WORKDIR /app# 复制项目文件
COPY requirements.txt .
RUN pip install -r requirements.txtCOPY . .# 运行测试
CMD ["pytest", "tests/", "--html=reports/report.html"]

最佳实践和进阶技巧

测试数据管理

# utils/test_data.py
import json
import yaml
from pathlib import Pathclass TestDataManager:"""测试数据管理器"""def __init__(self, data_dir="test_data"):self.data_dir = Path(data_dir)def load_json_data(self, filename):"""加载JSON测试数据"""file_path = self.data_dir / f"{filename}.json"with open(file_path, 'r', encoding='utf-8') as f:return json.load(f)def load_yaml_data(self, filename):"""加载YAML测试数据"""file_path = self.data_dir / f"{filename}.yaml"with open(file_path, 'r', encoding='utf-8') as f:return yaml.safe_load(f)# test_data/login_data.yaml
valid_users:- email: "user1@example.com"password: "password123"expected_result: "success"- email: "user2@example.com"password: "password456"expected_result: "success"invalid_users:- email: ""password: "password123"expected_error: "邮箱不能为空"- email: "invalid-email"password: "password123"expected_error: "邮箱格式不正确"

失败重试机制

# conftest.py
import pytest@pytest.fixture(autouse=True)
def retry_failed_tests(request):"""失败测试重试机制"""if request.node.rep_call.failed:# 重试逻辑pass# 使用pytest-rerunfailures插件
# pip install pytest-rerunfailures
# pytest --reruns 3 --reruns-delay 2

并行测试执行

# 安装pytest-xdist
# pip install pytest-xdist# 并行执行测试
# pytest -n auto  # 自动检测CPU核心数
# pytest -n 4     # 使用4个进程

测试环境管理

# utils/environment.py
import os
from enum import Enumclass Environment(Enum):DEV = "dev"TEST = "test"STAGING = "staging"PROD = "prod"class EnvironmentConfig:"""环境配置管理"""def __init__(self):self.current_env = Environment(os.getenv('TEST_ENV', 'test'))def get_base_url(self):"""获取当前环境的基础URL"""urls = {Environment.DEV: "http://dev.example.com",Environment.TEST: "http://test.example.com",Environment.STAGING: "http://staging.example.com",Environment.PROD: "http://example.com"}return urls[self.current_env]def get_database_config(self):"""获取数据库配置"""configs = {Environment.TEST: {"host": "test-db.example.com","database": "test_db"},Environment.STAGING: {"host": "staging-db.example.com","database": "staging_db"}}return configs.get(self.current_env, {})

性能测试集成

# tests/test_performance.py
import time
import pytest
from selenium.webdriver.support.ui import WebDriverWaitclass TestPerformance:"""性能测试"""def test_page_load_time(self, driver):"""测试页面加载时间"""start_time = time.time()driver.get("https://example.com")WebDriverWait(driver, 10).until(lambda d: d.execute_script("return document.readyState") == "complete")load_time = time.time() - start_timeassert load_time < 5.0, f"页面加载时间过长: {load_time}秒"def test_search_response_time(self, driver, search_page):"""测试搜索响应时间"""search_page.open("https://example.com")start_time = time.time()search_page.search_product("iPhone")# 等待搜索结果出现WebDriverWait(driver, 10).until(lambda d: len(d.find_elements(*search_page.SEARCH_RESULTS)) > 0)response_time = time.time() - start_timeassert response_time < 3.0, f"搜索响应时间过长: {response_time}秒"

数据库验证

# utils/database.py
import sqlite3
import pymongo
from contextlib import contextmanagerclass DatabaseHelper:"""数据库操作助手"""def __init__(self, db_config):self.config = db_config@contextmanagerdef get_connection(self):"""获取数据库连接"""if self.config['type'] == 'sqlite':conn = sqlite3.connect(self.config['path'])elif self.config['type'] == 'mysql':import mysql.connectorconn = mysql.connector.connect(**self.config)try:yield connfinally:conn.close()def verify_user_created(self, email):"""验证用户是否创建成功"""with self.get_connection() as conn:cursor = conn.cursor()cursor.execute("SELECT * FROM users WHERE email = ?", (email,))result = cursor.fetchone()return result is not None# 在测试中使用数据库验证
def test_user_registration_with_db_verification(driver, db_helper):"""测试用户注册并验证数据库"""# 执行注册操作registration_page = RegistrationPage(driver)test_email = f"test_{int(time.time())}@example.com"registration_page.register_user(email=test_email,password="password123")# 验证UI显示成功assert registration_page.is_registration_successful()# 验证数据库中确实创建了用户assert db_helper.verify_user_created(test_email)

总结

本教程全面介绍了使用pytest和selenium进行Python自动化测试的完整流程,从环境搭建到高级技巧,涵盖了实际项目中的各个方面。

关键要点回顾

  1. 环境搭建: 正确配置Python环境、浏览器驱动和项目结构
  2. pytest框架: 掌握基础测试、fixture机制和参数化测试
  3. selenium操作: 学会元素定位、常用操作和等待机制
  4. 页面对象模式: 使用POM提高代码复用性和维护性
  5. 测试报告: 生成专业的HTML和Allure测试报告
  6. 持续集成: 配置CI/CD流程实现自动化测试
  7. 最佳实践: 应用进阶技巧提升测试质量和效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94741.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APM 系列(一):Skywalking 与 Easyearch 集成

概述 SkyWalking 是一个开源的可观测性平台&#xff0c;用于收集、分析、聚合和可视化服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法&#xff0c;即使在云之间也能保持对分布式系统的清晰视图。它是一个现代的 APM&#xff0c;专门为云原生、基于容器的分布式…

使用 AD 帐户从 ASP.NET 8 容器登录 SQL Server 的 Kerberos Sidecar

我最近在做一个项目,需要将一个 ASP.NET 8 Web API 应用程序容器化,该应用程序需要与本地运行的 SQL Server 数据库进行通信。我们决定将 ASP.NET 8 容器定位到 Linux 系统,因此必须与运行在 Windows AD 域中的数据库进行通信。 问题 我们之前的设置是使用 IIS 在 Windows …

More Effective C++ 条款11:禁止异常流出析构函数之外

More Effective C 条款11&#xff1a;禁止异常流出析构函数之外核心思想 在C中&#xff0c;析构函数绝对不允许抛出异常。如果异常从析构函数中传播出去&#xff0c;可能会导致程序立即终止或未定义行为&#xff0c;特别是在栈展开过程中处理已有异常时。通过捕获并处理所有析构…

商超高峰客流统计误差↓75%!陌讯多模态融合算法在智慧零售的实战解析

原创声明&#xff1a;本文为原创技术解析&#xff0c;核心技术参数、架构设计及实战数据引用自 “陌讯技术白皮书”&#xff0c;技术方案与落地案例结合aishop.mosisson.com智慧零售数据联动场景展开&#xff0c;禁止未经授权的转载与商用。 一、行业痛点&#xff1a;智慧零售…

PyTorch实战(2)——使用PyTorch构建神经网络

PyTorch实战&#xff08;2&#xff09;——使用PyTorch构建神经网络0. 前言1. PyTorch 构建神经网络初体验1.1 使用 PyTorch 构建神经网络1.2 神经网络数据加载1.3 模型测试1.4 获取中间层的值2. 使用 Sequential 类构建神经网络3. PyTorch 模型的保存和加载3.1 模型保存所需组…

关于git的安装(windows)

1.git的介绍 Git 是一个分布式版本控制系统&#xff0c;由 Linus Torvalds 在 2005 年为 Linux 内核开发而创建。它能够高效地处理从小型到超大型项目的版本管理&#xff0c;具有以下特点&#xff1a; 分布式架构&#xff1a;每个开发者本地都有完整的仓库副本高效性能&#…

Java后端开发?接口封装器!

开发接口确实是Java后端开发中最核心、最可见的产出工作。“对入参校验、处理业务逻辑、返回格式处理”——精准地描述了一个API接口的核心处理流程。 但这只是冰山之上最直观的部分。一个专业、稳健、可扩展的后端系统&#xff0c;其复杂性和价值绝大部分隐藏在冰山之下。结合…

【沉浸式解决问题】NVIDIA 显示设置不可用。 您当前未使用连接到NVIDIA GPU 的显示器。

目录一、问题描述二、环境版本三、原因分析四、解决方案一、问题描述 在看一篇cuda安装的教程时&#xff0c;第一步是打开NVIDIA 控制面板&#xff0c;但是我打不开&#xff1a; NVIDIA 显示设置不可用。 您当前未使用连接到NVIDIA GPU 的显示器。 二、环境版本 设备&#xf…

牛客周赛 Round 106(小苯的方格覆盖/小苯的数字折叠/ 小苯的波浪加密器/小苯的数字变换/小苯的洞数组构造/ 小苯的数组计数)

A 小苯的方格覆盖思路&#xff1a;怎么摆第三行都是横放的2*1&#xff1b;故若n为奇数&#xff0c;总格子数3n为奇数&#xff0c;无法被2整除&#xff0c;直接排除。#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<bits/stdc…

高并发内存池(16)-三层缓存的回收过程

高并发内存池&#xff08;16&#xff09;-三层缓存的回收过程 内存池的回收过程是内存管理系统的关键环节&#xff0c;它通过分层协作和智能合并机制&#xff0c;确保内存高效重复利用。以下是完整的回收流程解析&#xff1a;一、回收触发场景 ThreadCache回收&#xff1a;线程…

深入解析MyBatis Mapper接口工作原理

在Java持久层框架中&#xff0c;MyBatis以其灵活性和易用性赢得了广大开发者的青睐。作为MyBatis的核心概念之一&#xff0c;Mapper接口机制极大地简化了数据库操作代码的编写。本文将深入剖析MyBatis Mapper接口的工作原理&#xff0c;从基础概念到底层实现&#xff0c;帮助开…

疯狂星期四文案网第49天运营日记

网站运营第49天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 常州苏州那些ip锲而不舍的扫了很多php的页面 今日搜索引擎收录情况 k页面比较严重了&#xff0c;哎。 我感觉不该做其他类型文案的 网…

从GPT-5发布来分析LLM大模型幻觉收敛(一)

GPT-5 号称在任何领域都有博士级别能力。在医疗健康领域&#xff0c;能够对专业的癌症诊断报告做通俗易懂的解读。对复杂的放射治疗方案决策&#xff0c;也能提供详细的分析报告&#xff0c;帮助病人权衡利弊。一位癌症患者的家属在发布会上表示&#xff0c;“ 真正鼓舞人心的是…

大模型安全概述、LlamaFirewall

资料搜集整理自网络。 概述 大模型爆火之后&#xff0c;衍生出大模型安全这一个比较新的领域。和之前的文章一样&#xff0c;本文有不少新颖的名词、概念、理论。 信通院、清华大学等多个单位联合发布的《大模型安全实践&#xff08;2024&#xff09;》&#xff0c;提出LLM安…

【目标检测】论文阅读3

Lightweight tomato ripeness detection algorithm based on the improved RT-DETR 论文地址 摘要 番茄具有很高的营养价值&#xff0c;需要对成熟果实进行准确的成熟度鉴定和选择性采收&#xff0c;以显著提高番茄收获管理的效率和经济效益。以往对番茄智能收获的研究往往只以…

Python音频分析与线性回归:探索声音中的数学之美

摘要&#xff1a;通过Python实现WAV音频信号处理与线性回归建模&#xff0c;揭示双声道音频的数学关联性&#xff0c;为声音特征分析提供新视角。1. 音频数据处理流程 1.1 WAV文件读取与预处理 使用scipy.io.wavfile读取音频文件&#xff0c;获取采样率与时域信号数据&#xff…

Linux shell脚本数值计算与条件执行

变量的数值计算实践 1 算术运算符 如果要执行算术运算&#xff0c;就会离不开各种运算符号&#xff0c;和其他编程语言类似&#xff0c;Shell 也有很多算术运算符。 下面就给大家介绍一下常见的 Shell 算术运算符&#xff1a; 、-&#xff0c;一元正号和负号。、-&#xff0c;加…

C#实战:基于iTextSharp实现PDF加密小工具

目录 1、技术框架 2、代码实战 2.1 创建窗体 2.2 后台代码逻辑 2.3 PDF加密用户类型 2.4 PDF加密权限列表 3、运行效果 4、总结 大家日常办公中有时候为了文档资料的安全需要对文档进行加密,尤其是针对PDF文档这个场景还是非常广泛的。今天给大家分享使用C#来实现PDF…

基于Labview的旋转机械AI智能诊断系统

1.摘要本文基于 CWRU 公开轴承数据集提出了一套“AI 轻量级模型 LabVIEW 智能诊断系统”。首先&#xff0c;LabVIEW 端构建了可视化、可交互的智能诊断平台。系统能够加载本地振动信号数据&#xff0c;调用训练好的深度学习模型进行故障识别与状态判断。界面集成信号时域监测、…

Qt从qmake迁移到cmake的记录

文章目录1.UI程序[开启/关闭]控制台2.增加宏定义3.在主项目中引入子项目4.使用C语言文件1.UI程序[开启/关闭]控制台 qmake&#xff1a; CONFIG console DEFINES QT_MESSAGELOGCONTEXTcmake&#xff1a; set(CMAKE_WIN32_EXECUTABLE OFF) # ON为关闭控制台 OFF为开启控制台2…