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

qtcanpool 知 09:测试框架

文章目录

  • 前言
  • 不满
  • 改进
  • 优化
  • 后语

前言

很久以前,作者写的代码都没有测试用例,最多就是写个 demo 验证一下,毕竟不是专业出身,也没经过大公司的洗礼。
后来,参与到一些项目才知道有专门的测试,而且开发也要测试(开发自测、白盒测试、单元测试)。有兴趣的读者可以去了解一下 TDD(测试驱动开发)方法论。

关于c/c++的测试,作者先后用到过 cpptest、gtest、CMockery。但是,对于 Qt 这种带界面的程序该怎么测试呢?

Qt Test 是一个基于 Qt 的应用程序和库的单元测试框架。Qt Test 提供了单元测试框架中常见的所有功能,以及用于测试图形用户界面的扩展。
Qt Test 旨在简化基于 Qt 的应用程序和库的单元测试编写。
官方介绍:https://doc.qt.io/qt-6/qtest-overview.html

不满

根据 Qt 官方的测试教程,编写一个最简单的测试用例 tst_qstring.cpp 如下所示:

// tst_qstring.cpp
#include <QtTest/QtTest>// 测试套
class tst_QString: public QObject    
{Q_OBJECTprivate slots:void toUpper();  // 测试用例
};void tst_QString::toUpper()
{QString str = "Hello";QVERIFY(str.toUpper() == "HELLO");
}QTEST_MAIN(tst_QString)#include "tst_qstring.moc"

QTEST_MAIN 宏定义如下,实际上是定义一个 main 函数:

#define QTEST_MAIN(TestObject) \
int main(int argc, char *argv[]) \
{ \QTEST_MAIN_IMPL(TestObject) \
}#define QTEST_MAIN_IMPL(TestObject) \TESTLIB_SELFCOVERAGE_START(#TestObject) \QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<TestObject>(); \QApplication app(argc, argv); \app.setAttribute(Qt::AA_Use96Dpi, true); \QTEST_DISABLE_KEYPAD_NAVIGATION \TestObject tc; \QTEST_SET_MAIN_SOURCE_PATH \return QTest::qExec(&tc, argc, argv);

作者的不满,不是不满意,而是不满足,具体的不满足是:一个 Qt 测试应用程序只能测试一个测试类,如果需要编写很多测试类,一个个执行测试程序也太麻烦了。

解释如下:一个测试文件中通过 QTEST_MAIN 直接定义了一个 main 函数,通常一个应用程序只能有一个 main 函数,这导致一个测试应用程序只能测试一个测试类,一个测试类通常只测试一个类。

改进

问题描述:一个测试应用程序如何测试多个类?
问题分析:既然 QTEST_MAIN 宏是直接定义一个 main 函数,那么可以参考这个宏,main 函数由用户自己定义,然后在自定义的 main 函数中实例化不同的测试类进行测试,这样就可以在一个 main 函数执行多个测试类,从而实现一个测试应用程序测试多个类。

改进后的代码如下:(由一个 tst_qstring.cpp 文件变成了三个文件:tst_qstring.h、tst_qstring.cpp、main.cpp)

// tst_qstring.h
#pragma once#include <QtTest/QtTest>class tst_QString: public QObject    
{Q_OBJECTprivate slots:void toUpper();  // 测试用例
};// tst_qstring.cpp
#include "tst_qstring.h"void tst_QString::toUpper()
{QString str = "Hello";QVERIFY(str.toUpper() == "HELLO");
}// main.cpp
#include <QtTest/QtTest>
#include <QApplication>// 包含测试套头文件
#include "tst_qstring.h"#define TEST_RUN(TestObject) \TestObject TestObject##_var; \QTest::qExec(&TestObject##_var, argc, argv);int main(int argc, char *argv[])
{QApplication app(argc, argv);// 执行一个测试套TEST_RUN(tst_QString)return 0;
}

使用方法:如果想增加其它测试文件,只需要定义对应的 h 和 cpp 文件,然后在 main.cpp 中包含头文件,在 main 函数中调用 TEST_RUN 进行执行。

思考一下:初看没啥问题,实际使用的时候,太麻烦了。每次要多定义一个 h 文件,还要在 main.cpp 中做那么多操作,糟糕的设计。(这个框架思路有点像 cpptest,声明没有借鉴 cpptest)

优化

作者以前先用的 cpptest,后来用了 gtest 后,很爽,只需要调用一个相关宏来定义测试用例,然后 main 函数中调用宏 RUN_ALL_TESTS 就可以运行所有测试用例。

优化思路:

  • 定义一个 TEST_ADD 宏,用于在 cpp 文件中取代 QTEST_MAIN。QTEST_MAIN 是直接定义 main 函数,而 TEST_ADD 只是将测试类添加到测试队列中。
  • 定义一个 TEST_RUN_ALL 宏,用于在 main 函数中运行所有通过 TEST_ADD 添加的测试用例。

问题的关键点:TEST_ADD 宏该如何实现,才能在 main 函数执行前将测试类添加到测试队列中。因为,main 函数通常是程序的入口函数,可以简单理解为程序运行时执行的第一个函数。

TEST_ADD 宏实现思路:

  • 首先,TEST_ADD 宏被先执行,因为宏是在预处理阶段执行。
  • 如果 TEST_ADD 宏实现为函数调用,会有问题,因为在函数外面调用一个函数会报编译错误。
  • 在某些特定的编译器中,有 constructor 和 destructor 属性,可以用来指定某些函数在程序启动时执行(相当于“构造函数”)或在程序退出时执行(相当于“析构函数”)。这并不是标准C语言的特性,但在某些编译器下,确实可以用来模拟类似构造函数的效果。简单理解,构造函数可以先于 main 函数执行。但是这特性也不适合 TEST_ADD 宏。
  • 利用静态变量,main 函数是在所有静态变量和全局变量初始化完成后执行。(参考了 gtest,但没完全看明白 gtest 的实现)

测试框架实现的部分代码如下:(详细代码:https://gitee.com/icanpool/qtcanpool/tree/master/tests/common)

///
// tst_global.h/* UnitTest */
class UnitTest
{
public:UnitTest();~UnitTest();
public:static UnitTest &instance();void add(QObject *obj);void run(int argc, char *argv[]);
private:QVector<QObject *> s_testObjects;
};/* TestInfo */
class TestInfo
{
public:TestInfo(QObject *obj);
};#define TEST_ADD(TestObject)                                             \class TestObject##_TestClass                                         \{                                                                    \public:                                                              \static TestInfo _info;                                           \};                                                                   \TestInfo TestObject##_TestClass::_info = TestInfo(new TestObject);#define TEST_RUN_ALL() UnitTest::instance().run(argc, argv);///
// tst_global.cpp
UnitTest &UnitTest::instance()
{static UnitTest s_testInstance;return s_testInstance;
}void UnitTest::add(QObject *obj)
{if (obj) {s_testObjects.append(obj);}
}void UnitTest::run(int argc, char *argv[])
{for (QObject *obj : s_testObjects) {QTest::qExec(obj, argc, argv);}qDeleteAll(s_testObjects);s_testObjects.clear();
}TestInfo::TestInfo(QObject *obj)
{UnitTest::instance().add(obj);
}///
// main.cpp
#include <QApplication>#include "tst_global.h"int main(int argc, char *argv[])
{QApplication app(argc, argv);TEST_RUN_ALL();return 0;
}

使用方法:

  • 按 Qt 官方的教程编写测试文件,然后用 TEST_ADD 取代 QTEST_MAIN。
  • 编写 main.cpp 文件,在 main 函数中调用 TEST_RUN_ALL 宏函数。

具体使用,可以参考 qtcanpool 中的测试代码:https://gitee.com/icanpool/qtcanpool/tree/master/tests

后语

经过一段时间的测试,作者简单的体会是:Qt 虽然写的是界面程序,但本质是 C++,只要按照类来理解就方便测试了,主要测试类的接口。界面程序相比后台程序多了一些鼠标和按键的测试,这部分 QTest 也提供了相应的方法。

相关文章:

qtcanpool 知 09:测试框架

文章目录 前言不满改进优化后语 前言 很久以前&#xff0c;作者写的代码都没有测试用例&#xff0c;最多就是写个 demo 验证一下&#xff0c;毕竟不是专业出身&#xff0c;也没经过大公司的洗礼。 后来&#xff0c;参与到一些项目才知道有专门的测试&#xff0c;而且开发也要测…...

使用Apache HttpClient发起一个GET HTTP请求

Apache HttpClient 是一个强大且灵活的Java库&#xff0c;用于处理HTTP请求。 它提供了广泛的功能&#xff0c;包括对不同HTTP方法的支持、连接管理、Cookie处理等。 无论是与RESTful API交互、下载网页内容还是自动化网页任务&#xff0c;Apache HttpClient 都能通过其简洁而…...

C++ STL 容器系列(三)list —— 编程世界的万能胶,数据结构中的百变精灵

STL系列学习参考&#xff1a; C STL系列__zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html 学习C STL的三个境界&#xff0c;会用&#xff0c;明理&#xff0c;能扩展&#xff0c;STL中的所有容器都遵循这个规律&#xff0c;下面我们就按照这三个境…...

【前端学习笔记】TypeScript学习

1.什么是TypeScript TypeScript&#xff08;简称 TS&#xff09;是微软公司开发的一种基于 JavaScript &#xff08;简称 JS&#xff09;语言的编程语言。TypeScript 可以看成是 JavaScript 的超集&#xff08;superset&#xff09;&#xff0c;添加了类型系统和编译时类型检查…...

qt三大调试方法总结(printf\qDebug\qCDebug)

文章目录 1 传统方法2 qDebug传统方法扩展1 控制输出扩展2 日志格式扩展3 日志保存扩展4 源码定义护展5 开源扩展3 qCDebug方法扩展1 控制扩展2 格式化扩展3 保存日志扩展4 源码定义参考1 传统方法 #include<stdio.h> printf(“xboard hello printf”) 2 qDebug传统方法…...

耶鲁大学公开课《心理学导论》学习笔记:第 1 课 - 导论

概述 作为一个程序员&#xff0c;或者说&#xff0c;我们不管做什么行业&#xff0c;都可以或多或少的学习一些心理学 我们在生活工作中&#xff0c;其实都会有意无意的接触一些心理学原理&#xff0c;例如&#xff0c;【番茄工作法】、【内在动机与外在激励】 这里选择的是&…...

Android ConstraintLayout 约束布局的使用手册

目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用&#xff0c;实现按钮居中。相对于父布局的约束。 3、A Button 居中展示&#xff0c;B Button展示在A Button正下方&#xff08;距离A 46dp&#xff09;。相对于兄弟控件的约束…...

STM32F030单片机AD采集应用总结

最近在设计一款产品的AD时&#xff0c;采集到的电压老是比输入电压0.2V左右&#xff0c;电路如图所示 查阅资料得知&#xff0c;STM32f030 的输入阻抗应小于 50K。于是将电阻改为 39K/10K&#xff0c;但情况依旧。随后&#xff0c;干脆将电阻值改为 3.9K/1K&#xff0c;虽有一定…...

Web开发基础学习——通过React示例学习模态对话框

Web开发基础学习系列文章目录 第一章 基础知识学习之通过React组件学习模态对话框 文章目录 Web开发基础学习系列文章目录前言一、创建新的 React 应用二、 创建模态对话框组件三、修改 App.js四、 添加样式五、启动应用六、访问应用总结 前言 模态对话框&#xff08;Modal D…...

实例分割详解

实例分割详解 引言 实例分割是计算机视觉领域的一项复杂任务&#xff0c;它要求模型能够识别图像中不同类别的对象&#xff0c;并对每个单独的对象进行像素级别的分类。与语义分割不同的是&#xff0c;实例分割不仅要区分不同的类别&#xff0c;还要识别同一类别中的不同个体…...

Flink四大基石之State(状态) 的使用详解

目录 一、有状态计算与无状态计算 &#xff08;一&#xff09;概念差异 &#xff08;二&#xff09;应用场景 二、有状态计算中的状态分类 &#xff08;一&#xff09;托管状态&#xff08;Managed State&#xff09;与原生状态&#xff08;Raw State&#xff09; 两者的…...

vue深入理解输入框字符限制的优化设计

文章目录 深入理解输入框字符限制的优化设计背景与挑战输入框限制的重要性常见需求 多种实现方法解析方法一&#xff1a;基于实时过滤的字符限制方法二&#xff1a;借助正则验证方法三&#xff1a;提交时二次校验 性能优化无障碍设计延伸场景与最佳实践1. 多语言国际化支持2. 动…...

MySQL的子查询

SQL语句中嵌套select语句,嵌套查询 案例&#xff1a; select * from t1 where column1 (select column1 from t2); 补&#xff1a; 1.子查询外部的语句可以是insert/update/delete/select的任何一个 2.位置也可以在where/from/select之后 类型&#xff1a; 1.标量子查询…...

Kubernetes架构原则和对象设计

云原生学习路线导航页&#xff08;持续更新中&#xff09; 快捷链接 Kubernetes常见问题解答 本文从 Google Borg系统的架构设计开始&#xff0c;深入讲解Kubernetes架构及组件的基本原理 1.什么是云计算 1.1.传统行业应用 假设有10台服务器&#xff0c;两个应用。小规模管…...

npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本

要以管理员身份打开PowerShell&#xff0c;请按照以下步骤操作&#xff1a; 在Windows搜索框中查找PowerShell&#xff1a; 在任务栏上&#xff0c;点击左下角的Windows徽标&#xff08;或按Win S键&#xff09;以打开搜索框。输入“PowerShell”以查找PowerShell应用程序。右…...

Linux CentOS

​阿里云开源镜像下载链接 https://mirrors.aliyun.com/centos/7/isos/x86_64/ VMware 安装 CentOS7 自定义 下一步 选择稍后安装操作系统 选择 输入 查看物理机CPU内核数量 CtrlShiftEsc 总数不超过物理机内核数量 推荐内存 自选 推荐 推荐 默认 拆分成多个 默认 自定义硬件…...

如何用注册机破解Reflexive游戏

相信有许多小朋友&#xff08;像我以前一样&#xff09;已经迫不及待地准备准备对浩瀚的、像三星堆一般的Reflexive游戏合集进行考古挖掘工作了。不巧的是&#xff0c;打开游戏之后发现常常提示要付费才能解锁完整版。 一、下载注册机与破解文件 首先&#xff0c;在我的永硕网…...

【算法day7】字符串:反转与替换

题目引用 反转字符串反转字符串II替换数字 1.反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&am…...

基于Linux C++多线程服务器 + Qt上位机开发 + STM32 + 8266WIFI的智慧无人超市

前言 针对传统超市购物车结账排队时间长、付款效率低的问题&#xff0c;提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账&#xff0c;理由显而易见&#xff1a;自助收银机结账很方便&#xff0c;几乎不用排队&am…...

继电器测试的培训和学习资源有哪些推荐?

继电器是电气控制设备中常见的一种元件&#xff0c;用于实现电路的开关控制和保护功能。对于从事电气相关工作的人员来说&#xff0c;掌握继电器的测试技能是非常重要的。以下是一些推荐的继电器测试培训和学习资源&#xff1a; 1. 在线课程&#xff1a;许多在线学习平台提供了…...

学习日志020---qt信号与槽

作业 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QPushButton,QLineEditfrom Form import Ui_Form from second import Ui_second from PySide6.QtCore import Qtclass MyWidget(QWidget,Ui_Form):def __init__(self):super().__init__()self.setupUi(se…...

小迪安全笔记 第四十四天 sql盲注 实战利用sql盲注 进行漏洞的利用

sql盲注的分类 什么是盲注 就是我们什么也不知道的情况下进行的注入 前边的注入 都是简单的注入 我们猜测 数据类型 之后 可以直接 union 去查 这种情况多用于 数据库增删查改中的 查 bool盲注也用于查 这个的情况的就是我们前边都试了 没有用 就需要…...

AMEYA360:上海永铭电子全新高压牛角型铝电解电容IDC3系列,助力AI服务器电源高效运转

随着数据中心和云计算的高速发展&#xff0c;AI服务器的能效要求日益提高。如何在有限空间内实现更高的功率密度和稳定的电源管理&#xff0c;成为AI服务器电源设计的一大挑战。永铭推出全新高压牛角型铝电解电容IDC3系列&#xff0c;以大容量、小尺寸的创新特性&#xff0c;为…...

SpringBoot Web 开发请求参数

SpringBoot Web 开发请求参数 简单的 web 请求: @RestController public class HelloController {@RequestMapping("sayHello")public String sayHello(){System.out.println("Hello World");return "hello world";} }获取请求参数 简单参数…...

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …...

网络安全、Web安全、渗透测试之笔经面经总结(一)

本篇文章总结涉及以下几个方面&#xff1a; 一&#xff1a;对称加密非对称加密&#xff1f; 对称加密&#xff1a;加解密用同一密钥&#xff0c;密钥维护复杂n&#xff08;n-1&#xff09;/2&#xff0c;不适合互联网传输密钥&#xff0c;加解密效率高。应用于加密数据。 非…...

11 设计模式之代理模式(送资料案例)

一、什么是代理模式&#xff1f; 在现实生活中&#xff0c;我们常常遇到这样的场景&#xff1a;由于某些原因&#xff0c;我们可能无法亲自完成某个任务&#xff0c;便会委托他人代为执行。在设计模式中&#xff0c;代理模式 就是用来解决这种“委托”问题的&#xff0…...

matlab2024a安装

1.开始安装 2.点击安装 3.选择安装密钥 4.接受条款 5.安装密钥 21471-07182-41807-00726-32378-34241-61866-60308-44209-03650-51035-48216-24734-36781-57695-35731-64525-44540-57877-31100-06573-50736-60034-42697-39512-63953 6 7.选择许可证文件 8.找许可证文件 9.选…...

齐护机器人ModbusRTU RS485转TTL通信模块与ESP32 Arduino通信可Mixly的图形化编程Scratch图形化编程

齐护机器人ModbusRTU RS485-TTL通信模块 一、概念理解 Modbus协议是一种由Modicon公司&#xff08;现为施耐德电气Schneider Electric&#xff09;于1979年发表的网络通信协议&#xff0c;旨在实现可编辑逻辑控制器&#xff08;PLC&#xff09;之间的通信。 1.1 什么是Mod…...

JDK、JRE、JVM的区别

JDK&#xff08;Java Development Kit&#xff09;、JRE&#xff08;Java Runtime Environment&#xff09;和JVM&#xff08;Java Virtual Machine&#xff09;是Java技术栈中的三个核心组件&#xff0c;它们各自有不同的功能和用途&#xff1a; 1. JDK&#xff08;Java Deve…...

linux基础2

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

vue 项目实现阻止浏览器记住密码

​在各个浏览器中&#xff0c;登录输入密码一般都会弹出是否记住密码的功能&#xff0c;如果记住之后&#xff0c;会在各个密码框自动填充记住的密码&#xff0c;这无疑是一种不安全的操作&#xff0c;所以要实现禁用阻止浏览器记住密码的行为 查阅资料&#xff0c;也得到很多…...

【23种设计模式】工厂模式:理论剖析与Java实践

文章目录 工厂模式&#xff1a;理论、Java 实现与实践应用一、工厂模式概述二、简单工厂模式&#xff08;一&#xff09;理论介绍&#xff08;二&#xff09;代码实现&#xff08;三&#xff09;关键步骤&#xff08;四&#xff09;流程图 三、工厂方法模式&#xff08;一&…...

(补充)JSON在Java后端的应用

JSON在Java后端的应用 本篇介绍 本篇文档不涉及到写一个JSON字符串&#xff0c;只是介绍如何在后端实现JSON字符串和Java对象的相互转换 Java对象转换为JSON字符串 在Java中&#xff0c;可以使用一个第三方工具包Jackson将Java对象转换为JSON对象&#xff0c;假设现在有一个…...

使用 Apache Commons IO 实现文件读写

在 Java 编程中&#xff0c;文件读写是常见的操作。虽然 Java 标准库提供了基本的文件 I/O 功能&#xff0c;但使用 Apache Commons IO 库可以进一步简化这些操作&#xff0c;提高开发效率。Apache Commons IO 是一个强大的工具库&#xff0c;提供了许多实用的类和方法&#xf…...

AWS ECS Task 添加 Prometheus 监控采集配置详细指南

以下是一篇完整的博文,介绍如何在 AWS ECS 环境中实现 JVM 监控。 AWS ECS 环境下的 JVM 监控实践 概述 在 AWS ECS (Elastic Container Service) 环境中监控 Java 应用性能是一项重要任务。本文将详细介绍如何使用 AWS Distro for OpenTelemetry (ADOT) 结合 Spring Boot …...

Vue+vite 组件开发的环境准备

一.nodejs安装 进入Node.js 官网&#xff08;Node.js — Run JavaScript Everywhere&#xff09;&#xff0c;点击下载。 双击打开&#xff0c;进行安装 双击打开后&#xff0c;点击 next&#xff08;下一步&#xff09;,后面也是一直点击 next 无其他设置&#xff0c;直到 …...

STM32 进阶 定时器:1系统定时器 系统中断案例 LED闪烁

定时器&#xff1a; 功能从高到低&#xff1a; TIM1和TIM8 高级控制定时器&#xff1a;输出能力更强&#xff0c;刹车控制、死区时间。 TIMx 通用定时器&#xff1a;可以输出PWM方波 TIM6和TIM7 基本定时器&#xff1a;只能计时 系统定时器 系统定时器&#xff08;SysTic…...

基于微信小程序的教学质量评价系统

​ 私信我获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 基于微信小程序的教学质量评价系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于微信小程序的教学质量评价系统的开发全过…...

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…...

在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案

在CentOS上无Parallel时并发上传.wav文件的Shell脚本解决方案 背景概述解决方案脚本实现脚本说明使用指南注意事项在CentOS操作系统环境中,若需并发上传特定目录下的.wav文件至HTTP服务器,而系统未安装GNU parallel工具,我们可通过其他方法实现此需求。本文将介绍一种利用Sh…...

实战ansible-playbook(四) -文件操作重定向/追加

原始命令: ----------阶段1--------------- apt-get update -y apt install nano vim iputils-ping net-tools dialog gcc apt-utils make -y systemctl stop unattended-upgradessystemctl disable unattended-upgradesecho APT::Periodic::Update-Package-Lists "1&qu…...

嵌入式 C 编程必备(7):const 关键字 —— 打造稳定的常量空间

目录 一、const关键字的基本含义与用法 1.1. 修饰基本数据类型 1.2. 修饰指针 1.3. 修饰数组 1.4. 修饰结构体 二、const关键字在嵌入式编程中的优势 2.1. 提升代码可读性 2.2. 增强代码安全性 2.3. 优化内存使用 2.4. 促进模块化设计 2.5. 支持静态分析和测试 三、…...

电脑显示没信号显示屏不亮怎么办?电脑没信号解决方法

电脑没信号显示屏不亮这种故障的原因可能有多种&#xff0c;例如显示器的供电、连接、设置等问题&#xff0c;或者电脑的显卡、内存、硬盘、主板等硬件问题。所以我们想要解决这个问题&#xff0c;也是需要多方面排除找到具体原因然后进行修复。下面将为大家介绍一些常见的电脑…...

C++零基础入门:运算符与表达式详解 —— 树莓派Pico编程应用

C语言作为信息学奥赛的指定语言&#xff0c;广泛应用于嵌入式开发、系统编程、游戏开发等领域。对于初学者而言&#xff0c;掌握基本的运算符和表达式是进行编程的基础&#xff0c;而这些基础知识能够帮助你解决各种实际问题。本文将带你深入理解C中的运算符与表达式&#xff0…...

mvc命令

命令 mvc MVC(Model-View-Controller)是一种软件架构模式,用于组织和管理应用程序的代码mvc重要的三部分 (1)‌模型&#xff08;Model&#xff09;‌&#xff1a;负责存储系统的中心数据&#xff0c;提供访问数据的函数&#xff0c;封装了应用程序的功能内核。 (2)视图&…...

Kafka-创建topic源码

一、命令创建topic kafka-topics --create --topic quickstart-events --bootstrap-server cdh1:9092 --partitions 2 --replication-factor 2 二、kafka-topics脚本 exec $(dirname $0)/kafka-run-class.sh org.apache.kafka.tools.TopicCommand "$" 脚本中指定了…...

如何开展单元测试

1、是什么 单元测试&#xff08;Unit Testing&#xff09;又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。 程序模块是软件设计的最小单位&#xff0c;程序单元是应用的最小可测试部件 • 在面向过程编程中&#xff0c;一个单元就是单个程序、函数、过…...

网络练级宝典-> UDP传输层协议

目录 传输层 端口号 端口号和进程的关系 UDP协议 UDP协议格式 UDP数据封装&#xff1a; UDP数据分用&#xff1a; 面向数据报 UDP的缓冲区 UDP的缺点 基于UDP的应用层协议 传输层 端口号 我们知道端口号对应的其实就是一个进程的pid&#xff0c;在操作系统中二者的…...

【Elasticsearch】07-ES聚合

1. 桶 桶&#xff08;Bucket&#xff09;聚合&#xff1a;用来对文档做分组 TermAggregation&#xff1a;按照文档字段值分组&#xff0c;例如按照品牌值分组、按照国家分组Date Histogram&#xff1a;按照日期阶梯分组&#xff0c;例如一周为一组&#xff0c;或者一月为一组…...