写了个单元测试辅助类,用于读取文本加入数据,删除数据和检查数据的

C++校园一卡通系统:控制台应用开发与数据持久化实战 面向对象编程是软件设计的核心范式,通过将数据与操作封装成类,实现了代码的高内聚和低耦合。其原理在于利用类、对象、继承和多态等特性构建模块化系统。在工程实践中,这种范式能显著提升代码的可维护性和可扩展性,尤其适用于需要清晰数据模型和复杂业务逻辑的应用场景,例如金融交易或资源管理系统。本文以C++实现一个校园一卡通管理系统为例,深入探讨了如何运用面向对象思想设计核心类(如Card和Transaction),并结合文件IO技术实现数据持久化。项目涵盖了用户认证、交易流水记录等关键模块,并针对指针管理、输入验证等常 阅读详情

下面是数据文本文件的格式

“#”号是注释

“T:”是加入

“D:”是删除表里面的数据

“C:”是检查数据

数据与数据之间用TAB隔开(可以从企业管理器直接把数据拷贝出来作为数据源)

加入数据的事列如下:

#插入用户表
# null为插入空
T:Users
John <TAB>John chan
Cake<TAB>Cake.lu
jeff<TAB>jeff.hu

# CheckTable's Data
#null为检查是否为空,skip掉过不检查,notnull检查他是否不为空
C:Users
John <TAB>John chan
Cake<TAB>Cake.lu
jeff<TAB>jeff.hu

#Delete All Data
D:TAbleName

调用代码:
参数1:文本文件的路径
参数2:是Helper里面的两个常量(其实可以是个Enum,不过写的时候没有注意)
Helper.ExecuteAction("Data.txt",Helper.INSERT);

参数3:是指定对那个对象操作(T:D:C:后面的名称,如T:Users,那么就填Users)
Helper.ExecuteACtion("Data.txt",Helper.Insert,"Users")

代码如下:

using System;
using System.Data;
using System.IO;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;
using NUnit.Framework;

namespace TestCore
{
 
 public class Helper
 {
  public const string DELETE="D";
  public const string INSERT="T";
  public const string CHECK="C";
  public const string ANNOTATE="#";


  private const string CommandList="D,T,C";
  
  public static string ConnectionString
  {
   //这里要写返回的连接字符串
   get{return WellDell.Castle.Config.Configure.ConnectionString;}
  }
  
  
  public static void ExecuteAction(string path,string action)
  {
   ExecuteAction(path,action,null);
  }
   
  public static void ExecuteAction(string path,string action,string inputTable)
  {
   Console.WriteLine("----------------"+action+" action is Start--------------------");
   
   StreamReader reader=new StreamReader(path);
   string line;
   string table=null;
   try
   {
    while(true)
    {
     line =reader.ReadLine();
     if(line==null)
      break;
     
     if(line.Length==0)
      continue;
     string Key=line.Substring(0,1);
     if(Key==ANNOTATE)
      continue;
     if(Key==action)
     {
      table=line.Substring(2);
      if(action==DELETE)
      {
       if(CheckTable(inputTable,table))
       {
        Delete(table);
       }
       table=null;
      }
      else
      {
       continue;
      }
     }
     else if(table!=null && !IsNewCommandStart(Key,action))
     {
      switch(action)
      {
       case INSERT:
        if(CheckTable(inputTable,table))
        {
         string[] datas=line.Split('/t');
         AddData(datas,table);
        }
        break;
       case CHECK:
        if(CheckTable(inputTable,table))
        {
         string[] checkDatas=line.Split('/t');
         Check(checkDatas,table);
        }
        break;
      }
     }
     else
     {
      continue;
     }
    }
   }
   finally
   {
    Console.WriteLine("----------------"+action+" action is End--------------------");
    reader.Close();
   }
  }
  //检查现有的Key 是否为新的命令的启动
  private static bool IsNewCommandStart(string CurrentKey,string action)
  {
   return CommandList.IndexOf(CurrentKey)!=-1;
  }
  private static bool CheckTable(string inputTable,string SettingTable)
  {
   if(inputTable==null)
    return true;
   return (inputTable==SettingTable);
  }
 
  private static void Delete(string table)
  {
   string sql=" delete from "+table;
   Console.WriteLine(sql);
   try
   {
    SqlHelper.ExecuteNonQuery(ConnectionString,CommandType.Text,sql);
   }
   catch(Exception e)
   {
    throw new ApplicationException("删除错误:Sql是"+sql,e);
   }
  }
  private static void AddData(string[] data,string table)
  {
   SqlConnection conn=new SqlConnection(ConnectionString);
   string sql="insert into "+table+" values ";
   string temp="('"+data[0]+"'";
   for(int i=1;i<data.Length;i++)
   {
    if(data[i]!="null")
     temp+=",'"+data[i]+"'";
    else
     temp+=",null";
   }
   sql+=temp+")";
   conn.Open();
   try
   {

    Console.WriteLine(sql);
    SqlCommand comm =new SqlCommand(sql,conn);
    comm.ExecuteNonQuery();
   }
   catch(Exception e)
   {
    throw new ApplicationException(table+":"+sql,e);
   }
   finally
   {
    conn.Close();
   }
  }
  private static void Check(string[] data,string table)
  {
   string sql="select * from "+table;
   Console.WriteLine(sql);
   DataSet ds = SqlHelper.ExecuteDataset(Helper.ConnectionString,CommandType.Text,sql);
   DataTable dt=ds.Tables[0];
   
   if(dt.Rows.Count==0)
    throw new ArgumentOutOfRangeException( sql+" 返回结构为空");

   foreach(DataRow dr in dt.Rows)
   {
    for(int i=0;i<data.Length;i++)
    {
     if(data[i].ToLower()=="skip")
      continue;
     if(data[i].ToLower()=="null")
     {
      Assert.IsTrue(dr[i].Equals(DBNull.Value),"expect is null ,but it's not null actualy");
      continue;
     }
     if(data[i].ToLower()=="notnull")
     {
      Assert.IsFalse(dr[i].Equals(DBNull.Value),"expect isn't null but it's null actualy");
      continue;
     }
     if(data[i].Length>=4 && data[i].Substring(0,4).ToLower()=="not:")
     {
      string txtValue=data[i].Substring(4).ToLower().Trim();
      string dbValue=dr[i].ToString().ToLower().Trim();
      Assert.IsTrue(txtValue!=dbValue,"db value is the same as data in text file,text file value is "+txtValue);
      continue;
     }

     if(dr[i].ToString().Length!=0 || dr[i].Equals(DBNull.Value))
     {
      Assert.IsTrue(dr[i].ToString()==data[i],table+":Check Value Is "+data[i]+",but DB is "+dr[i]);
      continue;
     }
    }
   }
  }
 }
}



SpringBoot 测试Control接口方法 例如,如果 Controller 方法调用了服务层的某个方法来获取数据并进行处理,在单元测试中可以使用 Mockito 来模拟服务层方法的返回值,然后验证 Controller 方法基于这个模拟返回值所做出的后续处理是否正确。- 构建请求:可以设置请求的方法(如 GET 、 POST 、 PUT 、 DELETE 等),添加请求参数(通过 param() 方法)、请求头(通过 header() 方法),还可以设置请求体内容(对于 POST 、 PUT 等请求)。 阅读详情

相关推荐

Python自动化数据可视化:从CSV/Excel到交互式图表全流程

数据可视化是数据分析与工程实践中的核心环节,它将原始数据转化为直观的图表,帮助揭示趋势、模式和洞察。其原理在于通过图形编码,将数据维度映射到视觉属性(如位置、颜色、大小),从而高效传递信息。在技术实现上,Python凭借其强大的生态系统,构建了从数据读取、清洗到图表生成与发布的完整自动化流水线,这极大地提升了数据处理的效率与可复现性。其中,Pandas作为数据处理基石,提供了DataFrame这一核心数据结构,能高效处理CSV、Excel等格式文件,并完成数据清洗与转换;而Matplotlib、Seabor

weixin_34364071的博客 683

Java list类型不确定_对象类型System.collections.Generic.List中不存在任何映射

错误:发生System.ArgumentException HResult = 0x80070057消息=对象类型System.Collections.Generic.List`1 [[System.Object,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]中没有映射存在已知的托管提...

weixin_39681171的博客 3214

配置文件读写测试

配置文件读写测试

传入字典的模型项的类型为“System.Collections.Generic.List`1[myConstr.ArticleInfo]”,但此字典需要类型“System.Collections.Ge

传入字典的模型项的类型为“System.Collections.Generic.List`1[myConstr.ArticleInfo]”,但此字典需要类型“System.Collections.Generic.IEnumerable`1[DAL.Models.ArticleInfo]”的模型项。 出现这个问题的原因是控制器中传给view的数据类型与View中设置的model类型不一致导致,

u011481131的博客 1万+

matlab球面投影(二)

matlab球面投影,想做一个全景相机,不知道,要做成啥样,于是在MATLAB先仿真一下,看下是个啥样子 百度别人做的,复制下面的代码到MATLAB的命令串口下,,网上找了张全景图,可以是bmp,jpg,改程序就可以了 回车运行就可以看到结果。 复制下面代码时,下面的中文注释记得删除,MATLAB是会报错的, close all; clear all; clc [x,y,z]=sphere(50); A=imread('a.JPG'); //名字是自己命名的,记得改 B=warp(x,y,-z,

rjszcb的博客 3165

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何高效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 277

System.Collections.Generic.List<xxxx>”隐式转换为“xxxx"

有两个匿名List ListData和List data,我想在ListData中移除所有data的值得到移除后的结果,于是想到了Remove   var range = db.UserList.Where(p =&gt; p.username.Equals(username)).Select(p =&gt; new { gropus = p.groups }).First(); var fo...

Cahier 8144

YOLOv8n行人检测实战:从数据集准备到模型训练

本文详细介绍了使用YOLOv8n进行行人检测的完整流程。首先阐述了YOLOv8的优势:高速推理(300+FPS)、更高精度、易用性和轻量化(仅6MB)。接着通过Docker搭建GPU训练环境,配置32GB共享内存避免数据加载问题,并安装必要的框架和OpenCV组件。数据集采用COCO2017标注格式,包含归一化坐标的YOLO标签文件。通过可视化脚本验证标注准确性后,提出多数据集融合训练策略以增强模型泛化能力。最后使用Ultralytics框架启动训练,展现了从环境搭建到模型训练的完整技术路径。该方案兼顾检测

Hi20240217的博客 1092

Ryujinx 模拟器入门指南:四步在电脑上运行你的第一支 Switch 游戏

在电脑上跑 Switch 游戏,最耗时的往往不是游戏本身,而是第一次:装好模拟器、弄懂 NSP 和 XCI 两种游戏文件、选对图形接口,再处理首次运行时的着色器编译卡顿。Ryujinx 是一个用 C# 编写的开源 Nintendo Switch 模拟器,支持 Windows、macOS 和 Linux 三个平台。本文按实际操作顺序,讲清从安装到跑起第一个游戏的路径,并标出它做不到的边界。 ##

gitblog_00557的博客 1065

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2475

oracle两节点RAC,由于gipc导致某节点crs无法启动问题分析

两节点RAC,其中1 节点集群CRS无法启动。经过分析原因为2节点gipcd进程异常,导致节点之间无法正常通信,重启2节点gipcd.bin后问题得以恢复。 从现象来看,是 ora.crsd...

cuibaye0692的博客 4536

C++圆形类设计:从基础封装到工业级实现的深度解析

面向对象编程(OOP)的核心思想在于将数据与操作封装成类,通过抽象、继承和多态提升代码的可维护性和复用性。其基本原理是通过访问控制实现数据隐藏,确保对象内部状态的完整性。在C++工程实践中,合理运用封装、构造函数设计、const成员函数等特性,能显著提升代码的健壮性和可读性。例如,设计一个几何图形类时,需考虑数据有效性校验、接口清晰度以及性能优化,这直接关系到模块的可靠性和协作效率。本文以C++实现圆形类为例,深入探讨了如何运用constexpr进行编译期优化,以及通过异常处理机制保障数据安全,为构建高质量

weixin_33946605的博客 346

BeikeShop跨境电商独立站系统V1.5.0免授权全开源版

BeikeShop 一款开源好用的跨境电商系统,BeikeShop 是基于 Laravel 开发的一款开源商城系统,主要面向外贸/跨境电商行业提供商品管理、订单管理、会员管理、支付、物流、系统管理等功能。BeikeShop商城 Beike多语言商城 多货币商城B2C商城系统 代码100%开源 PHP商城系统 H5/PC商城 跨境电商系统 跨境商城系统 电商商城系统 Laravel 9 框架插件化开发,MVC架构 支持插件市场。Event 机制实现Hook功能,自定义可视化装修。

820

Apache Iceberg测试方法论:确保数据质量与一致性的完整框架

Apache Iceberg作为现代数据湖解决方案,其强大的元数据管理和快照机制为数据质量保证提供了完整的测试框架。本文将深入探讨Iceberg的测试方法论,帮助您构建可靠的数据质量验证体系。🚀 ## 为什么需要专门的Iceberg测试框架 在传统数据仓库中,数据质量测试往往依赖于业务逻辑验证和ETL过程监控。然而,在数据湖架构中,我们需要处理更复杂的数据一致性、版本控制和并发写入场景。Ap

gitblog_00759的博客 1074

(王道考研计算机网络)第三章数据链路层-第一节:数据链路层功能概述

文章目录一:本章概述二:数据链路层基本概念三:数据链路层功能概述(1)为网络层提供服务(2)链路管理(3)组帧(4)流量控制(5)差错控制 本章是计算机网络中入门较难的一章,如果没有接触过相关内容,可能会止步于一些晦涩难懂的术语。本节内容希望大家可以用心看一看,对于大家入门是很有帮助的 一:本章概述 数据链路层位于物理层之上,主要作用就是提高物理层传输比特流的能力,使物理层可能出现差错的连接转变为逻辑上无差错的数据链路,同时向网络层提供服务。本章学习的主要就是数据链路层的功能和应用 数据链路层功能 封

快乐江湖的博客 2470

OTFS 消息传递算法信号检测【附matlab代码详解】

OTFS 消息传递算法方面的一些浅浅理解。

Cuby的博客 4013

接口测试的测试用例该怎么写呢?

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。接口测试大体分为两类:模块接口测试和 web 接口测试。模块接口测试 模块接口测试是单元测试的基础。它主要测试模块的调用与返回。经常需要编写一些桩模块与驱动模块。 主要测试要点如下: 检查接口返回的数据是否与预期结果一致。 检查接口的容错性,假如传递数据的类型错误时是否可以处理。 接口参数的边界值。例如,

1380

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Vibe Coding:AI辅助编程如何降低科研门槛,实现从意图到代码的快速转化

在数据驱动的科研与工程实践中,编程能力已成为验证模型、处理数据的关键瓶颈。传统上,研究者需投入大量时间学习Python等语言,过程漫长且易分散对核心问题的专注。AI辅助编程作为一种新兴范式,其核心原理在于利用大型语言模型理解自然语言意图,并自动生成、解释与调试代码,从而将研究者从繁琐的语法细节中解放出来。这一技术的核心价值在于显著降低技术门槛,提升原型开发与探索性分析的效率。其典型应用场景包括数据清洗、可视化、统计分析及简单建模等常见科研任务。通过构建“描述意图-生成代码-审查调试”的协作循环,研究者即使没

weixin_30701575的博客 402

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

压力测试的几种常见的解决方案

​ 在此模式下,无论更新请求的顺序如何,所有用户都该成功完成更新操作,特别需要关注的是数据的完整性和更新错误,如:当一个用户更新某记录的同时,它确被删除了。 处理并发测试时还要注意,当相同的数据可以通过不同的界面或者功能更新时,应该测试所有可能访问这条记录的功能。 ​

chengxuyuznguoke的博客 693

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

五大方法教你如何分分钟构造百万测试数据!

方法六:Python代码实现构造百万的数据 如果有代码基础的同学,也可以使用Python代码编程实现这个过程

hlsxjh的博客 714

ChatGPT充值后Codex写的代码能运行却不稳定?用测试矩阵补齐边界场景

ChatGPT充值后,开发者使用Codex开发时易忽视边界条件,导致代码在真实场景中不稳定(如空数据报错、并发异常等)。解决方案是建立测试矩阵,覆盖正常、异常、边界和兼容场景,分四层测试(正常流程、边界输入、异常环境、兼容回归)。建议先让Codex生成测试矩阵再编码,将测试规则写入AGENTS.md,并区分高低风险模块优先级。对于轻量任务,Plus版本足够;高频多模块开发需评估Pro版本。核心在于通过系统化测试流程确保代码在各类场景下稳定可靠。

cwx199903的博客 170

AI编程入门首选:Codex环境搭建与核心使用技巧全解析

代码生成是人工智能在软件开发领域的重要应用,其核心原理是基于大规模代码库训练的语言模型,能够将自然语言描述转化为可执行的程序代码。这项技术的价值在于显著降低编程门槛,提升开发效率,尤其适用于快速原型构建、代码补全和自动化脚本编写等场景。对于初学者而言,掌握一个对新手友好的AI编程工具至关重要。Codex作为专注于代码生成的模型,通过其直观的交互方式和实时的反馈机制,能够帮助用户快速建立编程信心。本文以Codex为例,详细介绍了如何从零开始搭建环境,并深入探讨了如何通过优化提示词来提升代码生成质量,从而让AI

weixin_33922670的博客 635

Python中的高效数据清洗与预处理技巧

通过read_csv()、read_excel()等方法可加载多种格式数据,配合info()、describe()和isnull().sum()可快速了解数据概览、统计特征和缺失情况。针对缺失数据,Pandas提供dropna()删除缺失值,fillna()填充缺失值。原始数据通常存在缺失值、异常值、重复值和不一致等问题,高质量的数据清洗能显著提升模型性能和分析结果的可靠性。Pandas的query()方法结合条件筛选能快速定位异常值,clip()方法可将超出阈值的数据截断至指定范围。

wzbdata的博客 509

零代码构建个性化错题专练网页:从数据表到交互应用全流程

低代码与无代码开发正成为快速构建应用的重要趋势,其核心原理是通过可视化拖拽、表单配置和预置模块,将传统编程中的界面、逻辑与数据操作抽象为直观的图形化操作,大幅降低了应用开发的技术门槛。这种模式的技术价值在于赋能非技术背景的业务人员、教育工作者及个人用户,使其能自主将特定需求转化为可用的数字工具,有效解决了轻量级业务管理、个性化学习辅助等场景下的快速原型验证与工具定制问题。以构建一个错题专练网页为例,用户无需编写代码,即可利用平台的数据表管理、界面设计器及交互逻辑配置功能,结合AI辅助生成数据与逻辑描述,快速

weixin_34327761的博客 383
上一篇: 数据库范式
下一篇: 猎狗公司——理想的管理制度
fantasylu
博客等级 码龄24年 0粉丝 4原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值