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

MQL语言实现单元测试

文章目录

    • 一、单元测试是什么
    • 二、单元测试的过程
    • 三、为什么需要单元测试
    • 四、MQL测试代码实现

一、单元测试是什么

单元测试是对软件中最小可测单元(如类或函数)进行独立验证和检查的过程。它是由开发工程师完成的,旨在确保每个单元的功能和逻辑正确性。单元测试通常涉及驱动代码、桩代码和模拟代码。

驱动代码是用于调用被测试单元的代码,它提供了测试输入并捕获输出结果。桩代码是用于模拟被测试单元所依赖的其他组件或模块的代码,以便在测试过程中隔离被测试单元。模拟代码是用于模拟外部依赖的行为,以便在测试过程中控制和验证被测试单元的交互。

二、单元测试的过程

  1. 确定要测试的单元:选择一个具体的类或函数作为测试的目标。
  2. 编写测试用例:根据被测试单元的功能和逻辑编写多个测试用例,覆盖不同的输入和边界情况。
  3. 编写测试代码:使用适当的测试框架编写测试代码,包括调用被测试单元并验证输出结果的断言。
  4. 运行测试:运行测试代码,确保所有的测试用例都能通过。
  5. 分析结果:检查测试结果,查找失败的测试用例并修复相关问题。
  6. 重复上述步骤:持续编写和运行测试,直到所有的测试用例都能够通过。

通过单元测试,开发工程师可以及早发现和修复代码中的错误,提高代码质量和可维护性,确保软件的各个组件能够正常工作。

三、为什么需要单元测试

  1. 确保代码质量:单元测试可以帮助开发者验证代码的正确性,确保代码按照预期工作。通过编写针对每个函数或方法的单元测试,可以及早发现潜在的问题和错误,从而提高代码的质量。

  2. 提高代码可维护性:单元测试可以作为代码的文档,帮助开发者理解和维护代码。当需要修改代码时,可以通过运行单元测试来验证修改是否影响了代码的正确性。

  3. 支持重构和优化:单元测试可以在重构和优化代码时提供保障。通过运行单元测试,可以确保重构和优化后的代码仍然按照预期工作,避免引入新的问题。

  4. 提高开发效率:虽然编写单元测试需要一定的时间和精力,但它可以帮助开发者在后期节省大量的调试时间。通过及早发现和解决问题,可以减少调试的时间和精力,提高开发效率。

  5. 支持持续集成和自动化测试:单元测试是持续集成和自动化测试的基础。通过编写可自动运行的单元测试,可以在每次代码提交后自动运行测试,及早发现问题,确保代码的稳定性和可靠性。

因此,单元测试是保证代码质量、提高开发效率和可维护性的重要手段。

四、MQL测试代码实现

#property link          "VX: mtquant"
#property version		"1.10"
#property description   "MQL语言的一个简单的单元测试工具。."#define assert_equal(v_1, v_2) _assert_equal(__FILE__, __FUNCTION__, (string)__LINE__, (v_1), (v_2))class TestCase 
{protected:string errors[];uint   error_len;uint   tests_number;uint   successful_tests_number;uint   start_time;// changed parametersstring output_file_path;public:TestCase() {error_len = 0;tests_number = 0;successful_tests_number = 0;output_file_path = MQLInfoString(MQL_PROGRAM_NAME) + "_unit_test_log.txt";start_time = GetTickCount();}//void set_output_file_path(string _output_file_name){output_file_path = _output_file_name;};//void add_error(string error) {error_len++;ArrayResize(errors, error_len);errors[error_len-1] = error;}//template<typename T1,typename T2>void _assert_equal(string file, string func_sig, string line, T1 v_1, T2 v_2){tests_number++;// ex: TestFunc.mq4(38), MyTest::test_string_len(): 11 != 5if (v_1 != v_2) add_error(file + "(" + line + "), " + func_sig + "(): " + (string)v_1 + " != " + (string)v_2);elsesuccessful_tests_number++;}//string pretty_time(int ms) {return (string)(ms/1000) + " sec";}//bool check_file(int h_file) {if (h_file < 0) {Comment(output_file_path + ": Error with file creation (error: " + (string)GetLastError() + ")");return false;}return true;}//bool init_log_file() {int handle = FileOpen(output_file_path, FILE_WRITE, ";");if (!check_file(handle)) return false;FileWrite(handle, StringFormat("--- %s: Unit Test: running... ---", TimeToString(TimeLocal())));FileClose(handle);return true;}//virtual void declare_tests(){}//void run(){if (!init_log_file()) return;declare_tests();// write logint handle = FileOpen(output_file_path, FILE_WRITE, ";");if (check_file(handle)) {FileWrite(handle, StringFormat("--- %s: Unit Test: passed tests %d from %d (elapsed time: %s) ---",TimeToString(TimeLocal()), successful_tests_number, tests_number, pretty_time(GetTickCount() - start_time)));for (uint i=0;i<error_len;i++)FileWrite(handle, errors[i]);FileClose(handle);}}
};
class SimpleTest: public TestCase 
{void test_math_abs() {assert_equal(MathAbs(-1.25), 1.25);assert_equal(MathAbs(2.15), 2.15);}void test_string_len() {assert_equal(StringLen("xxx"), 3);assert_equal(StringLen("some string"), 5);  // test fails}void declare_tests() {test_math_abs();test_string_len();}
};double min(double v_1, double v_2) 
{if (v_1 > v_2) return v_2;return v_1;
}class MyFunctionTest: public TestCase 
{void test_my_function_min() {assert_equal(min(4, 10), 4);assert_equal(min(8, 1), 1);assert_equal(min(5, 0), 5);  // test fails}void declare_tests() {test_my_function_min();}
};void OnStart() 
{SimpleTest simple_test;simple_test.run();MyFunctionTest my_function_test;my_function_test.set_output_file_path(MQLInfoString(MQL_PROGRAM_NAME) + "_MyFunctionTest_unit_test.log");  // long namemy_function_test.run();
}

相关文章:

MQL语言实现单元测试

文章目录 一、单元测试是什么二、单元测试的过程三、为什么需要单元测试四、MQL测试代码实现 一、单元测试是什么 单元测试是对软件中最小可测单元&#xff08;如类或函数&#xff09;进行独立验证和检查的过程。它是由开发工程师完成的&#xff0c;旨在确保每个单元的功能和逻…...

Redis信创平替之TongRDS(东方通),麒麟系统安装步骤

我的系统: 银河麒麟桌面系统V10(SP1)兆芯版 1.先进入东方通申请使用 2.客服会发送一个TongRDS包与center.lic给你(我这里只拿到.tar.gz文件,没有网上的什么安装版) 3.上传全部文件到目录中 4.服务节点安装,并启动 tar -zxvf TongRDS-2.2.1.2_P3.Node.tar.gz cd pmemdb/bin/…...

nginx服务

“欢唱吧&#xff0c;呼唤它&#xff0c;回来啊~” Web服务器简介 Web服务器&#xff0c;一般是指“网站服务器”&#xff0c;其本质就是驻留于互联网中&#xff0c;某一台机器(计算机)上的进程(程序)。Web服务器通常就是为用户提供信息浏览服务&#xff0c;更可以放置数据文件…...

多数pythoneer只知有列表list却不知道python也有array数组

数组和列表 Python中数组和列表是不同的&#xff0c;我敢断言大多数的pythoneer只知道有列表list&#xff0c;却不知道python也有array数组。列表是一个包含不同数据类型的元素集合&#xff0c;而数组是一个只能含相同数据类型的元素集合。 Python的array库是一个提供数组操作…...

【Rust】——控制流(if-else,循环)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…...

通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试

mydev.c #include <linux/init.h> #include <linux/module.h> #include <linux/of_gpio.h> #include <linux/gpio.h> #include <linux/platform_device.h> #include <linux/mod_devicetable.h>// 创建功能码 #define LED_ON _IO(l, 1) #d…...

费舍尔FISHER金属探测器探测仪维修F70

美国FISHER LABS费舍尔地下金属探测器&#xff0c;金属探测仪等维修&#xff08;考古探金银铜探宝等仪器&#xff09;。 费舍尔F70视听目标ID金属探测器&#xff0c;Fisher 金属探测器公司成立于1931年&#xff0c;在实验条件很艰苦的情况下&#xff0c;研发出了地下金属探测器…...

Airtest-Selenium实操小课③:下载可爱猫猫图片

1. 前言 那么这周我们看看如何实现使用Airtest-Selenium实现自动搜索下载可爱的猫猫图片吧~ 2. 需求分析和准备 整体的需求大致可以分为以下步骤&#xff1a; 打开chrome浏览器 打开百度网页 搜索“可爱猫猫图片” 定位图片元素 创建存储图片的文件夹 下载可爱猫猫图片…...

Druid无法登录监控页面

问题表现&#xff1a;在配置和依赖都正确的情况下&#xff0c;无法通过配置的用户名密码登录Druid的监控页面 检查配置发现 配置的用户名和密码和请求中参数是一致的&#x1f914; Debug发现 ResourceServlet 是Druid的登录实现&#xff0c; 且调试发现usernameParam是null&am…...

【Linux系统化学习】深入理解匿名管道(pipe)和命名管道(fifo)

目录 进程间通信 进程间通信目的 进程间通信的方式 管道 System V IPC&#xff08;本地通信&#xff09; POSIX IPC&#xff08;网络通信&#xff09; 管道 什么是管道 匿名管道 匿名管道的创建 匿名管道的使用 匿名管道的四种情况 匿名管道的五种特性 命名管道 …...

信息学奥赛一本通1209:分数求和

1209&#xff1a;分数求和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 19111 通过数: 10647 【题目描述】 输入n个分数并对他们求和&#xff0c;并用最简形式表示。所谓最简形式是指&#xff1a;分子分母的最大公约数为11&#xff1b;若最终结果的分母为11&am…...

LabVIEW储氢材料循环寿命测试系统

LabVIEW储氢材料循环寿命测试系统 随着氢能技术的发展&#xff0c;固态储氢技术因其高密度和安全性成为研究热点。储氢材料的循环寿命是衡量其工程应用的关键。然而&#xff0c;传统的循环寿命测试设备存在成本高、测试效率低、数据处理复杂等问题。设计了一种基于LabVIEW软件…...

Unity3D 框架如何搭建基于纯Lua的U框架与开发模式详解

前言 Unity3D 是一款非常流行的游戏开发引擎&#xff0c;它支持C#、JavaScript和Boo等多种脚本语言。而Lua语言作为一种轻量级的脚本语言&#xff0c;也在游戏开发中得到了广泛应用。本文将介绍如何在Unity3D框架中搭建基于纯Lua的U框架&#xff0c;并详细讲解其开发模式。 对…...

Linux常见指令(2)

目录 1、tar指令 &#xff01; 2、bc指令 3、uname 4、重要热键 5、关机 1、tar指令 &#xff01; 功能&#xff1a;压缩/解压缩文件或目录,类似zip 我们先来看一下我们的文件即目录&#xff0c;接下来我们输入指令&#xff1a; tar -czf test.tgz test 压缩 -c &#xf…...

【C++】封装

1.封装的意义 封装是C面向对象三大特性之一 实例化&#xff08;通过一个类 创建一个对象的过程&#xff09; 类中的属性和行为 我们统一称为 成员 属性 成员属性 成员变量 行为 成员函数 成员方法 封装的意义&#xff1a; 1.将属性和行为作为一个整体&#xff0c;表现生活中的事…...

Maxwell安装部署

1 Maxwell输出格式 database&#xff1a;变更数据所属的数据库table&#xff1a;变更数据所属的表type&#xff1a;数据变更类型ts&#xff1a;数据变更发生的时间xid&#xff1a;事务idcommit&#xff1a;事务提交标志&#xff0c;可用于重新组装事务data&#xff1a;对于inse…...

说一下JVM类加载机制?

Java中的所有类&#xff0c;都需要由类加载器装载到JVM中才能运行。类加载器本身也是一个类&#xff0c;而它的工作就是把class文件从硬盘读取到内存中。 在写程序的时候&#xff0c;我们几乎不需要关心类的加载&#xff0c;因为这些都是隐式装载的&#xff0c;除非我们有特殊…...

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…...

mysql在服务器中的主从复制Linux下

mysql在服务器中的主从复制Linux下 为什么要进行主从复制主从复制的原理主从复制执行流程操作步骤主库创建从库创建 测试 为什么要进行主从复制 在业务中通常会有情况&#xff0c;在sql执行时&#xff0c;将表锁住&#xff0c;导致不能进行查询&#xff0c;这样就会影响业务的…...

QT-Day2

思维导图 作业 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#x…...

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

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

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...