一、测试设计概述测试设计(Test Design) 是将被测对象的需求或实现逻辑转化为可执行测试用例的系统性方法。其核心目标是:
有效性 - 用最少用例覆盖最多缺陷
完备性 - 覆盖所有需求分支和异常场景
可维护性 - 用例易于理解和更新
可自动化 - 支持脚本化验证(避免人工检查)测试设计活动流程:
二、常见测试设计方法方法1:划分等价类按照因子的约束对其取值范围进行等价类划分
方法2:边界值分析法因为出错的问题容易出现在边界问题上,所以可以在边界附近进行采样多次测试
因子组合技术:多个测试因子进行组合1.AC(All Combinations)即全面覆盖,要把所有的测试因子都覆盖到位
2.EC(Each Choice)
3.BC(Basic Choice)选取基本用例,每次只改变基本用例(选取典型)
4.N-wise(主要2-wise)性价比最高
三、代码覆盖评估方法
基础框架
一、gtest(Google Test)定位:Google 开源的 C++ 单元测试框架核心功能:
结构化测试
1234TEST(TestSuiteName, TestName) { // 定义测试用例 EXPECT_EQ(3, Add(1, 2)); // 断言:验证相等 ASSERT_NE(nullptr, CreateObject()); // 断言失败则终止当前测试}
测试夹具(Fixtures):复用初始化逻辑
12345678910class DatabaseTest : public ::testing::Test { protected: void SetUp() override { db.Connect(); } // 每个测试前执行void TearDown() override { db.Disconnect(); } // 测试后清理Database db;};TEST_F(DatabaseT ...
开发工具
未读开发者测试的本概念1.测试的定义开发者测试(Developer Testing,DT),也称为技术测试或构建者测试,指的是由软件开发人员自己在编码过程中或代码提交前后主动进行的各种测试活动。其核心目标是尽可能早地在开发阶段发现并修复缺陷(Bug),提高代码质量和系统可靠性。
2.测试核心目标与价值:
早期缺陷发现: 在代码提交或交付给测试团队之前发现尽可能多的 Bug,因为越早发现 Bug,修复成本越低。
提升代码质量: 促使开发者编写更清晰、更模块化、更可测试的代码。
加速反馈循环: 开发者能在几秒或几分钟内获得代码变更的反馈,而不是等待漫长的测试周期。
支持重构与维护: 提供安全网,确保重构或修改代码时不会意外破坏现有功能。
增强开发者信心: 开发者对自己的代码更有信心,减少向测试团队或用户交付错误时的焦虑。
减少整体测试成本: 虽然开发者需要投入时间编写测试,但减少了后期昂贵的集成测试、系统测试和缺陷修复成本。
定义“完成”: 代码不仅要通过编译,还需要通过自动化测试,才算真正完成一个功能。
3.主要测试类型(范围从核心到边界):
单元测试(UT):
核心: 测试代码的最小 ...
Redis 之所以能够用来做发布/订阅(Pub/Sub)功能,主要是因为它提供了内置的 Pub/Sub 机制,允许消息的发布者和订阅者之间实现异步消息传递。下面是 Redis 能够实现 Pub/Sub 的几个关键点:
1. 轻量级、快速的消息传递机制Redis 本质上是一个内存数据库,它的高性能使得它在消息传递中能够提供低延迟的通信。发布者可以立即将消息发布到 Redis 中,而 Redis 以极快的速度将消息推送给所有订阅者。
2. 发布/订阅的工作机制Redis 的 Pub/Sub 模型是一种简单的广播机制,它工作流程如下:
发布者:通过 PUBLISH 命令将消息发送到某个频道(channel)。
订阅者:通过 SUBSCRIBE 命令订阅一个或多个频道。一旦订阅者订阅了某个频道,该订阅者就会接收到该频道发布的所有消息。
1.使用Jedis作为客户端
123456789101112// 发布消息Jedis jedis = new Jedis("localhost");jedis.publish(& ...
title: 动态线程池组件:项目总结date: 2024/9/6categories: 项目tag:
后端开发
组件
项目
线程池cover: https://jsd.onmicrosoft.cn/gh/youdekangkang/blogImage@main/img/image-20240906034412240.png
组件的特点?因为任务会分为CPU密集型以及IO密集型,每一种方案都会需要不同的场景配置,但是你又不能保证所有的配置都是最优值。所以既然不能保证参数配置最合理,那么是否可以通过将修改线程池参数的成本降下来,这样⾄少可以发⽣故障的时候可以快速 调整从⽽缩短故障恢复的时间?基于这个思考,我们可以将线程池的参数从代码中迁移到注册中心上, 实现线程池参数可动态配置和即时⽣效。
为什么要自研线程池?问题1:为什么要自研?
这是很典型的问题,很多人也会比较奇怪为什么放着好的成熟的方案不适用非要自己写一套东西。以下便是自己写组件的好处:
1.满足特定需求: 自研可以更精准地匹配内部业务场景,定制化功能以满足特定的业务需求。 成熟的实现可能无法覆盖所有细 ...
代码概览1234567891011121314151617181920212223242526272829303132333435363738package fun.hyperzhu.middleware.dynamic.thread.pool.sdk.trigger.job;import com.alibaba.fastjson.JSON;import fun.hyperzhu.middleware.dynamic.thread.pool.sdk.domain.IDynamicThreadPoolService;import fun.hyperzhu.middleware.dynamic.thread.pool.sdk.domain.model.entity.ThreadPoolConfigEntity;import fun.hyperzhu.middleware.dynamic.thread.pool.sdk.registry.IRegistry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.sp ...
添加一个Listener的模块
1234567891011121314151617181920212223242526272829public class ThreadPoolConfigAdjustListener implements MessageListener<ThreadPoolConfigEntity> { private Logger logger = LoggerFactory.getLogger(ThreadPoolConfigAdjustListener.class); private final IDynamicThreadPoolService dynamicThreadPoolService; private final IRegistry registry; public ThreadPoolConfigAdjustListener(IDynamicThreadPoolService dynamicThreadPoolService, IRegistry registry) { this ...
工程结构
domain: ThreadPoolConfigEntity 动态线程池配置实体。
trigger:触发器, DynamicThreadPoolController 接收前端⻚⾯发送的数据。
types:设置返回结果类型, Response 。
应用层
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293@Slf4j@RestController()@CrossOrigin("*")@RequestMapping("/api/v1/dynamic/thread/pool/")public class DynamicThreadPoolController { @Resource public Redi ...