用Nunit测试通讯程序
时间:2022-04-23
本文章向大家介绍用Nunit测试通讯程序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
对于Nunit,我是个纯粹的新手,没想到,第一个练手的,居然是一个通讯程序。难度略微大了点。我的通讯程序是一个类似通讯服务器的程序,能够监听和维持多个连接,并实现向任意连接的收发数据。因为原来实现过类似的东西,这次做的步子又前进了一些,把整个服务器的这种工作模式抽象出来了,做成了一个与具体业务无关的通讯层。我只是按照自己的想法把代码写了出来,上层还有很多逻辑层代码,如果在原来,就得等全套代码都好了,才能开始进行测试和修改。不过,现在我有Nunit,更准确的说,是有了Testdriven.Net,终于可以实现这种“局部测试”了。
为了测试,写了一个简单的终端模拟类,用来和服务器通讯。然后构造测试的代码,经过半天的摸索,终于差不多了,比较高兴。中间被卡了一段时间,后来把收和发都放到独立与测试程序的线程中,问题解决了。
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using System.Threading;
namespace ComServer.DA
{
/// <summary>
/// connections的测试
/// </summary>
[TestFixture]
public class Test_Connections
{
int cnt;
Thread th;
Thread th2;
Test_SendClient ts;
DateTime dt0;
TimeSpan alltim; //耗时
public void mynoti(int typ, object[] args)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss")+ args[1].ToString());
cnt++;
}
[SetUp] //初始化,产生接收和发送方
public void testsetup()
{
cnt = 0;
Connections cns = new Connections(5008, 500, 500, 3, new Dele_ConnsNotify(mynoti), 437, 437);
th = new Thread(cns.StartListen);
th.Start();
ts = new Test_SendClient();
th2 = new Thread(ts.DoTest);
th2.Start();
dt0 =new DateTime();
dt0 = DateTime.Now;
}
/// <summary>
/// 测试仅仅发送的效果,在10秒内,如果收到5个包,则测试通过。
/// </summary>
[Test]
public void t1()
{
alltim = DateTime.Now - dt0;
while (alltim.TotalSeconds < 10)
{
Console.WriteLine("time:" + alltim.ToString()+"rncnt:"+cnt.ToString());
Thread.Sleep(1000);
alltim = DateTime.Now - dt0;
}
Assert.AreEqual(cnt,5);
Console.WriteLine("测试(10s内收5个包)结束!");
}
[TearDown]
public void t1teardown()
{
th.Abort();
ts.Exit();
th2.Abort();
}
}
}
几点心得:
1。有时Testdriven.net的console输出不是很及时,该显示的却不显示,在Nunit GUI中基本上不会出问题。
2。多线程的情况下,Nunit GUI关闭后,有个延时,估计是等待线程结束。
3、Testdriven.net对于Nunit支持的很好,测试时,能够自动运行Test、Teardown等标签。不过我的右键菜单中的Nunit一会儿有一会儿没有,还没搞懂。
4、Testdriven.net的debug很不错,基本上我就很少用vs的调试。
- Radiant: 基于Ruby on Rails的内容管理系统
- “大数据”如何追回1.3亿元税款?
- Enterprise Library深入解析与灵活应用(5):创建一个简易版的批处理执行器,认识Enterprise Library典型的配置方式和对象创建方式
- BTC.com时讯-IBM等老牌大企业因区块链技术获得新活力
- Kit 3D 更新
- Enterprise Library深入解析与灵活应用(5):创建一个简易版的批处理执行器,认识Enterprise Library典型的配置方式和对象创建方式
- 晚上好啊!这是今天人工智能精选要闻
- 构建Flex应用的10大误区
- Flex的起步推动新语言学习
- 简单科普云计算相关内容
- Silverlight初级教程-开发工具
- WCF的Binding模型之五:绑定元素(Binding Element)
- 2018年物联网发展趋势
- Silverlight初级教程-概述
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP判断一个变量是否为整数、正整数的方法示例
- android实现打地鼠游戏
- Yii框架连表查询操作示例
- Android studio listview实现列表数据显示 数据循环显示效果
- 关于Curl在Swoole协程中的解决方案详析
- Flutter随机迷宫生成和解迷宫小游戏功能的源码
- Yii框架实现对数据库的CURD操作示例
- Laravel5.4框架中视图共享数据的方法详解
- Android视频悬浮窗口实现的示例代码
- 使用Laravel中的查询构造器实现增删改查功能
- Flutter 自定义Drawer 滑出位置的大小实例代码详解
- laravel5.1框架基础之路由详解
- flutter 自定义card阴影效果及card使用
- laravel5.1框架基础之Blade模板继承简单使用方法分析
- Yii框架的布局文件实例分析