软件测试全流程指南:手把手教你从单元测试到黑盒测试

news2026/4/8 11:06:57
软件测试全流程实战从单元测试到黑盒测试的完整指南1. 为什么我们需要系统化的软件测试在软件开发的世界里测试不是可选项而是确保产品质量的生命线。想象一下你花费数月开发的应用程序在上线第一天就崩溃了用户数据丢失系统无法恢复——这样的灾难性场景往往源于测试环节的缺失或不足。软件测试的本质是通过系统化的方法验证软件行为是否符合预期它贯穿于整个开发生命周期。有效的测试能够提前发现缺陷在开发早期阶段发现并修复问题成本远低于生产环境保障系统稳定性确保新增功能不会破坏现有功能回归测试验证需求实现确认软件确实实现了需求文档中定义的功能提升代码质量促使开发者编写更模块化、可测试的代码测试金字塔理论告诉我们一个健康的测试体系应该由大量底层单元测试、适量集成测试和少量端到端测试组成。这个金字塔结构不仅反映了测试的粒度也暗示了执行速度和维护成本的关系/\ / \ 端到端测试(UI/黑盒) /____\ / \ 集成测试(服务/API) /________\ / \ 单元测试(函数/模块) /____________\2. 单元测试构建稳固的代码基础2.1 单元测试的核心概念单元测试是针对软件中最小组件通常是函数或方法的隔离测试。它就像建筑中的砖块检测确保每一块砖都达到质量标准才能建造稳固的大厦。关键特征快速执行毫秒级完全隔离使用mock/stub确定性结果相同输入永远产生相同输出高代码覆盖率理想情况下80%2.2 实战使用JUnit编写单元测试下面是一个Java方法的测试示例使用JUnit 5和Mockito框架// 被测类 public class PaymentService { private final PaymentGateway gateway; public PaymentService(PaymentGateway gateway) { this.gateway gateway; } public PaymentResult processPayment(PaymentRequest request) { if (request.amount() 0) { throw new IllegalArgumentException(金额必须大于零); } return gateway.charge(request); } } // 测试类 class PaymentServiceTest { Test void processPayment_正常金额_返回成功结果() { // 准备测试数据 PaymentGateway mockGateway mock(PaymentGateway.class); PaymentService service new PaymentService(mockGateway); PaymentRequest request new PaymentRequest(100.0, USD); // 设置mock行为 when(mockGateway.charge(request)) .thenReturn(new PaymentResult(SUCCESS, 支付成功)); // 执行测试 PaymentResult result service.processPayment(request); // 验证结果 assertEquals(SUCCESS, result.status()); verify(mockGateway).charge(request); } Test void processPayment_零金额_抛出异常() { PaymentService service new PaymentService(mock(PaymentGateway.class)); assertThrows(IllegalArgumentException.class, () - service.processPayment(new PaymentRequest(0, USD))); } }2.3 单元测试最佳实践命名规范采用被测方法名_测试条件_预期结果的格式3A原则Arrange准备测试环境和数据Act执行被测方法Assert验证结果FIRST原则Fast快速Isolated隔离Repeatable可重复Self-validating自验证Timely及时编写提示单元测试应该像科学实验一样可重复。避免使用随机数据确保每次运行结果一致。3. 集成测试验证组件协作3.1 什么是集成测试集成测试验证多个单元组合在一起时能否正确协作。它关注的是接口和数据流而不是内部实现细节。常见场景服务与数据库的交互API端点与业务逻辑的集成微服务之间的通信3.2 实战Spring Boot集成测试SpringBootTest class UserServiceIntegrationTest { Autowired private UserRepository userRepo; Autowired private UserService userService; Test Transactional void createUser_有效数据_成功保存到数据库() { // 准备测试数据 UserDto dto new UserDto(testexample.com, Test User); // 执行测试 User savedUser userService.createUser(dto); // 验证数据库状态 User dbUser userRepo.findById(savedUser.getId()).orElseThrow(); assertEquals(testexample.com, dbUser.getEmail()); assertEquals(Test User, dbUser.getName()); } Test void createUser_重复邮箱_抛出异常() { userRepo.save(new User(existstest.com, Existing User)); UserDto dto new UserDto(existstest.com, New User); assertThrows(DuplicateEmailException.class, () - userService.createUser(dto)); } }3.3 集成测试策略策略描述优点缺点自底向上从底层组件开始测试逐步向上早期验证核心组件高层逻辑测试较晚自顶向下从高层组件开始逐步向下早期验证主要流程需要大量stub混合策略结合两种方法平衡优缺点复杂度较高持续集成每次提交都运行测试快速发现问题需要完善的基础设施4. 白盒测试深入代码内部4.1 白盒测试技术白盒测试基于对代码内部结构的了解设计测试用例。主要技术包括语句覆盖确保每行代码至少执行一次分支覆盖验证每个条件判断的真假分支路径覆盖覆盖所有可能的执行路径条件组合覆盖测试所有可能的条件组合4.2 实战使用Pytest进行白盒测试# 被测函数 def calculate_discount(amount, is_member, coupon_codeNone): if amount 0: raise ValueError(金额必须为正数) discount 0 if is_member: discount 0.1 # 会员10%折扣 if coupon_code SAVE20: discount 0.2 elif coupon_code SAVE10: discount 0.1 final_amount amount * (1 - min(discount, 0.3)) # 最高30%折扣 return round(final_amount, 2) # 测试用例 class TestDiscountCalculator: def test_negative_amount(self): with pytest.raises(ValueError): calculate_discount(-100, True) def test_non_member_no_coupon(self): assert calculate_discount(100, False) 100 def test_member_no_coupon(self): assert calculate_discount(100, True) 90 pytest.mark.parametrize(coupon,expected, [ (SAVE10, 80), # 会员10% SAVE10 10% 20% (SAVE20, 70), # 会员10% SAVE20 20% 30% (上限) (INVALID, 90) # 无效优惠码不影响会员折扣 ]) def test_with_coupons(self, coupon, expected): assert calculate_discount(100, True, coupon) expected4.3 覆盖率工具使用覆盖率工具可以量化测试的完整性# 安装pytest-cov pip install pytest-cov # 运行测试并生成报告 pytest --covmy_module tests/理想的覆盖率目标语句覆盖80%分支覆盖70%路径覆盖50%5. 黑盒测试从用户视角验证5.1 黑盒测试方法黑盒测试不关心内部实现只验证输入输出是否符合预期。常用技术包括等价类划分将输入数据划分为有效/无效类别边界值分析测试输入范围的边界条件决策表系统化地测试各种条件组合状态转换验证系统在不同状态下的行为5.2 实战使用Selenium进行Web测试from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys def test_login_success(): driver webdriver.Chrome() try: driver.get(https://example.com/login) # 输入凭据并提交 driver.find_element(By.ID, username).send_keys(valid_user) driver.find_element(By.ID, password).send_keys(correct_password) driver.find_element(By.ID, submit).click() # 验证登录成功 assert Dashboard in driver.title welcome driver.find_element(By.CSS_SELECTOR, .welcome-message).text assert valid_user in welcome finally: driver.quit() def test_login_failure(): driver webdriver.Chrome() try: driver.get(https://example.com/login) # 输入错误密码 driver.find_element(By.ID, username).send_keys(valid_user) driver.find_element(By.ID, password).send_keys(wrong_password) driver.find_element(By.ID, submit).click() # 验证错误消息 error driver.find_element(By.CLASS_NAME, error-message).text assert Invalid credentials in error finally: driver.quit()5.3 黑盒测试用例设计示例用户注册功能测试矩阵测试场景用户名密码确认密码预期结果正常注册user1Pass123Pass123注册成功密码太短user2abcabc显示错误密码不匹配user3Pass123pass123显示错误用户名为空(空)Pass123Pass123显示错误SQL注入尝试admin--xx显示错误/阻止6. 测试驱动开发(TDD)实战6.1 TDD核心流程TDD遵循红-绿-重构的循环红编写一个失败的小测试绿编写最少代码使测试通过重构改进代码结构保持测试通过6.2 实战使用TDD开发字符串计算器# 第一步测试空字符串返回0 def test_add_empty_string(): assert add() 0 # 实现 def add(numbers): return 0 # 第二步测试单个数字 def test_add_single_number(): assert add(5) 5 # 更新实现 def add(numbers): return 0 if not numbers else int(numbers) # 第三步测试逗号分隔的数字 def test_add_two_numbers(): assert add(1,2) 3 # 更新实现 def add(numbers): if not numbers: return 0 return sum(int(x) for x in numbers.split(,)) # 第四步测试换行符分隔 def test_add_newline_delimiter(): assert add(1\n2,3) 6 # 更新实现 import re def add(numbers): if not numbers: return 0 return sum(int(x) for x in re.split(r[,\n], numbers)) # 继续添加测试用例和实现...6.3 TDD的优势与挑战优势产生高测试覆盖率的代码促进简单设计快速反馈循环作为活的文档挑战初期学习曲线陡峭对现有代码库引入困难需要团队共识和纪律7. 测试自动化与持续集成7.1 构建测试流水线现代软件开发中自动化测试是持续集成/持续交付(CI/CD)管道的核心部分。典型的流水线阶段代码提交触发自动化构建单元测试快速反馈基本问题集成测试验证组件交互端到端测试验证完整用户流程性能测试确保系统负载能力安全测试检查漏洞部署通过所有测试后自动部署7.2 示例GitHub Actions配置name: CI Pipeline on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - name: Set up Python uses: actions/setup-pythonv2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest pytest-cov - name: Run unit tests run: | pytest --covsrc --cov-reportxml tests/unit/ - name: Upload coverage uses: codecov/codecov-actionv1 - name: Run integration tests run: pytest tests/integration/ - name: Run e2e tests run: pytest tests/e2e/ env: TEST_ENV: staging TEST_URL: ${{ secrets.STAGING_URL }}7.3 测试环境管理有效的测试需要合适的环境策略环境类型用途特点本地开发开发者日常测试快速迭代不完全可靠持续集成自动化测试执行干净、一致、可重复预发布模拟生产环境接近生产配置生产真实用户环境最高保真度风险最高8. 高级测试策略与模式8.1 测试替身(Test Doubles)当被测对象依赖其他组件时使用替身可以隔离测试类型描述使用场景Dummy仅填充参数的空对象需要参数但不使用Stub提供预设响应的简单实现测试简单路径Mock预设期望并验证交互验证行为而非状态Fake轻量级功能实现替代重量级依赖如内存数据库Spy记录调用信息的包装器验证间接输出8.2 契约测试在微服务架构中契约测试确保服务之间的接口约定不被破坏。使用Pact框架的示例// 消费者端测试 const { Pact } require(pact-foundation/pact); describe(User Service Client, () { const provider new Pact({ consumer: WebApp, provider: UserService, }); beforeAll(() provider.setup()); afterEach(() provider.verify()); afterAll(() provider.finalize()); it(获取用户详情, () { const expectedUser { id: 1, name: John Doe, email: johnexample.com }; await provider.addInteraction({ state: 用户ID 1存在, uponReceiving: 获取用户详情的请求, withRequest: { method: GET, path: /users/1 }, willRespondWith: { status: 200, body: like(expectedUser) } }); const client new UserServiceClient(provider.mockService.baseUrl); const user await client.getUser(1); expect(user).toEqual(expectedUser); }); });8.3 混沌工程在生产环境中故意引入故障来测试系统韧性。常见实验包括随机终止服务实例注入网络延迟或丢包填充磁盘空间模拟CPU或内存压力工具推荐Chaos Monkey (Netflix)Litmus (Kubernetes)Gremlin9. 测试指标与质量评估9.1 关键测试指标指标计算公式理想范围缺陷密度缺陷数/千行代码1缺陷/KLOC测试覆盖率(已覆盖代码/总代码)×100%80%单元测试测试通过率(通过测试数/总测试数)×100%100%关键测试缺陷发现率测试阶段发现的缺陷占比80%在上线前平均修复时间从发现到修复的总时间/缺陷数根据严重程度分级9.2 测试报告示例使用Allure生成丰富的测试报告!-- pom.xml配置 -- plugin groupIdio.qameta.allure/groupId artifactIdallure-maven/artifactId version2.10.0/version /plugin生成报告mvn clean test allure:report报告内容包括测试执行趋势按严重性分类的结果失败测试的堆栈跟踪环境信息自定义附件截图、日志等10. 测试策略制定与优化10.1 风险驱动的测试策略根据项目特点调整测试重点项目类型主要风险测试重点金融系统数据准确性、安全性验证计算、审计追踪、渗透测试电商平台并发性能、支付流程负载测试、端到端事务测试IoT设备资源限制、稳定性内存泄漏测试、长时间运行测试移动应用设备碎片化、用户体验跨设备测试、响应式设计验证10.2 测试自动化策略自动化金字塔指导如何分配自动化测试资源手动测试(5%) / \ / \ UI自动化(15%) / \ / \ API/服务层自动化(30%) / \ /_________________\ 单元测试自动化(50%)自动化候选标准高频执行的测试容易出错的重复任务关键业务路径数据驱动的测试场景跨环境的一致性检查10.3 测试环境治理建立有效的环境管理策略基础设施即代码使用Terraform或Ansible定义环境容器化Docker提供一致的环境环境隔离为每个功能分支创建临时环境数据管理使用合成测试数据每次测试后重置数据库避免生产数据在测试环境使用11. 测试工具生态全景11.1 测试工具分类测试类型推荐工具单元测试JUnit, pytest, Mocha, RSpec集成测试TestNG, Jest, PostmanUI自动化Selenium, Cypress, Playwright性能测试JMeter, Gatling, k6安全测试OWASP ZAP, Burp Suite, NessusAPI测试RestAssured, Supertest, Karate移动测试Appium, Espresso, XCUITest契约测试Pact, Spring Cloud Contract混沌工程Chaos Monkey, Litmus, Gremlin11.2 工具选择考量因素团队技能选择团队熟悉或容易上手的工具技术栈匹配确保工具支持项目使用的语言和框架社区支持活跃社区意味着更好的问题解决资源集成能力与现有CI/CD工具链的兼容性维护成本考虑学习曲线和长期维护投入可扩展性能否满足未来可能的测试需求增长12. 测试团队与流程建设12.1 测试角色演进现代软件团队中的测试角色已经从单纯的找bug者转变为质量倡导者质量分析师定义质量标准和指标测试自动化工程师构建和维护测试框架SDET(软件研发测试工程师)开发测试工具和基础设施质量教练指导团队建立质量实践DevOps测试专家优化测试在CI/CD中的集成12.2 测试左移与右移测试左移需求阶段开始测试活动编写可测试的需求开发前定义验收标准结对编程和代码审查测试右移生产环境监控金丝雀发布特性开关真实用户行为分析12.3 质量文化培养全员质量责任质量不只是测试团队的事质量指标透明化可视化仪表板展示关键指标质量门禁定义发布的质量标准根本原因分析对缺陷进行深入分析而非简单修复持续改进定期回顾并优化测试策略13. 新兴测试趋势与挑战13.1 AI在测试中的应用测试用例生成基于代码分析自动生成测试视觉验证使用CV技术比较UI截图智能测试排序优化测试执行顺序异常检测识别测试结果中的异常模式自修复测试自动调整脆弱的UI选择器13.2 微服务测试挑战服务隔离如何单独测试一个服务依赖管理处理外部服务的不可控性数据一致性跨服务的事务测试契约演进确保接口变更不会破坏消费者端到端复杂度服务组合爆炸问题13.3 无代码测试工具低代码/无代码测试平台如Testim, Mabl使得非技术人员也能创建自动化测试优势降低自动化门槛快速创建测试可视化结果分析局限复杂场景支持有限定制化能力不足可能产生脆弱测试14. 测试职业发展路径14.1 技能矩阵职级技术能力流程能力领导力初级基础测试技术, 简单自动化执行测试用例, 报告缺陷个人任务管理中级高级自动化, 框架开发测试计划制定, 风险评估指导初级成员高级全栈测试能力, 性能/安全质量策略制定, 流程优化跨团队协作专家创新测试方法, 工具研发组织级质量体系设计技术领导力14.2 认证体系ISTQB国际软件测试资格认证AWS/Azure测试认证云环境测试专家Selenium认证Web自动化专家安全测试认证CEH, OSCP敏捷测试认证ICAgile, Scrum.org14.3 持续学习资源书籍《Google软件测试之道》《有效的单元测试》《持续交付》社区Ministry of TestingSelenium ConfTest Automation University博客/播客Software Testing WeeklyTest Code PodcastAutomation Panda15. 测试反模式与陷阱15.1 常见测试反模式冰激凌蛋筒测试UI测试过多底层测试不足脆弱测试过度依赖实现细节的测试慢速测试执行缓慢导致反馈延迟重复测试多层级测试验证相同逻辑从不失败的测试断言不足或过于宽松测试与实现拷贝测试重复生产代码逻辑15.2 测试数据管理陷阱生产数据滥用违反隐私法规静态测试数据导致测试间相互影响难以重现的数据阻碍缺陷调试过度准备数据增加测试维护成本数据依赖链一个测试失败导致后续测试失败15.3 测试自动化误区全自动化妄想试图自动化所有测试过早自动化在功能不稳定时投入自动化无维护策略任由测试腐烂工具过度工程复杂框架解决简单问题忽视可视化缺乏有效的报告机制16. 测试与DevOps文化16.1 DevOps中的测试原则自动化一切将测试完全纳入流水线快速反馈分层测试确保及时发现问题质量内建测试是开发过程的一部分生产就绪始终假设代码可能随时部署监控即测试生产监控作为最后一道防线16.2 构建质量门禁在CI/CD流水线中设置必须通过的质量检查点代码风格检查使用linter工具静态代码分析SonarQube等工具单元测试覆盖率设置最低阈值集成测试通过率关键测试必须通过构建时间限制避免测试过程过长安全扫描OWASP依赖检查等16.3 可观察性与测试现代系统需要结合三种可观察性支柱进行验证日志记录离散事件工具ELK, Loki指标量化系统状态工具Prometheus, Datadog追踪请求全链路跟踪工具Jaeger, Zipkin测试断言可以验证这些可观察性数据例如确认错误日志不超过阈值验证99%的请求延迟500ms检查分布式追踪中的服务调用顺序17. 测试代码的代码质量17.1 测试代码的SOLID原则测试代码同样需要良好的设计单一职责每个测试验证一个明确方面开放封闭易于添加新测试而不修改现有里氏替换测试基类的地方可替换为子类接口隔离针对抽象而非具体实现测试依赖反转通过注入依赖提高可测试性17.2 测试代码重构模式测试工具方法提取重复的测试逻辑对象构建器简化复杂测试对象的创建测试数据工厂集中管理测试数据生成页面对象封装UI元素和交互Web测试测试钩子setup/teardown的智能使用17.3 测试代码审查要点代码审查时应检查测试代码的明确性测试意图是否清晰独立性是否依赖其他测试状态可靠性是否有时序或竞态问题维护性是否过度耦合实现细节有效性是否真正验证了需求18. 性能测试进阶18.1 性能测试类型类型目标关键指标负载测试验证系统在预期负载下的行为吞吐量, 响应时间压力测试找出系统极限崩溃点, 错误率浸泡测试发现长时间运行的问题内存泄漏, 性能衰减尖峰测试验证突发流量的处理能力恢复时间, 错误率配置测试优化系统参数不同配置的性能比较18.2 实战使用k6进行负载测试import http from k6/http; import { check, sleep } from k6; export let options { stages: [ { duration: 30s, target: 20 }, // 20用户30秒 { duration: 1m, target: 100 }, // 100用户1分钟 { duration: 20s, target: 0 }, // 逐渐降为0 ], thresholds: { http_req_duration: [p(95)500], // 95%请求500ms http_req_failed: [rate0.01], // 错误率1% }, }; export default function () { let res http.get(https://api.example.com/products); check(res, { status is 200: (r) r.status 200, response time 500ms: (r) r.timings.duration 500, }); sleep(1); // 每次请求间隔1秒 }18.3 性能测试结果分析关键分析步骤识别瓶颈CPU、内存、I/O、网络比较基准与历史数据或SLA对比趋势分析性能随时间的变化相关性分析指标间的相互影响根本原因深入代码或架构层面工具推荐Grafana (可视化)Prometheus (指标收集)Jaeger (分布式追踪)Pyroscope (持续剖析)19. 安全测试要点19.1 OWASP Top 10防护测试针对最常见的Web应用安全风险进行测试注入SQL、NoSQL、OS命令失效的身份认证弱密码、会话管理敏感数据泄露不恰当的加密XML外部实体(XXE)XML处理器漏洞失效的访问控制水平/垂直权限提升安全配置错误默认配置、暴露信息跨站脚本(XSS)存储型、反射型、DOM型不安全的反序列化远程代码执行使用含有已知漏洞的组件依赖库风险不足的日志记录和监控无法检测入侵19.2 安全测试工具链静态分析SonarQube, Checkmarx依赖扫描OWASP Dependency-Check, Snyk动态分析OWASP ZAP, Burp Suite网络扫描Nmap, Nessus密码破解John the Ripper, Hashcat模糊测试AFL, libFuzzer19.3 安全测试集成示例在CI流水线中加入安全扫描# .gitlab-ci.yml stages: - test - security dependency_scan: stage: security image: owasp/dependency-check:latest script: - dependency-check --scan . --format HTML --out reports/ artifacts: paths: [reports/] zap_scan: stage: security image: owasp/zap2docker-stable:latest script: - zap-baseline.py -t https://example.com -r report.html artifacts: paths: [report.html]20. 测试的未来展望20.1 测试工程的新范式AI辅助测试自动生成和维护测试用例智能测试数据生成异常行为预测混沌即服务云平台提供的混沌实验服务生产环境测试蓝绿部署金丝雀发布特性开关无服务器测试适应serverless架构的测试策略量子计算测试新兴计算范式的验证方法20.2 测试人员的技能演进未来测试专家可能需要编程数据科学编写智能测试算法云原生技术测试分布式系统领域专业知识深入垂直行业知识用户体验设计从用户视角验证产品业务分析连接技术与商业价值20.3 质量工程的兴起质量工程(QE)将取代传统测试强调全流程质量从需求到运维的全链路质量保障数据驱动基于指标的质量决策预防为主通过架构和流程预防缺陷自动化优先最大化自动化覆盖率持续反馈实时质量监控与改进

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…