用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()+"\r\ncnt:"+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的调试。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

借用 疯狂秀才 的页面,修改了一下自然框架后台管理的页面。

  不知道为什么,就是不喜欢extJS,昨天看到了疯狂秀才的页面,大家都说好,那我就借鉴一下吧。下载源码,加到aspx里面。运行,居然有js错误。一模一样的呀,...

3147
来自专栏刘望舒

Android网络编程(二)HttpClient与HttpURLConnection

相关文章 Android网络编程(一)HTTP协议原理 前言 上一篇我们了解了HTTP协议原理,这一篇我们来讲讲Apache的HttpClient和Java的...

2047
来自专栏跟着阿笨一起玩NET

使用windows服务和MSMQ和进行日志管理(解决高并发问题)

然后就可以写我们的代码了,我们的服务需要实时监视MSMQ的队列中有没有记录,如果有,就向数据库中插入

3741
来自专栏Ken的杂谈

C# MD5加密-MD5Helper

2.5K3
来自专栏施炯的IoT开发专栏

windows mobile窗口之间传递数据的方法

    在windows mobile上设计UI的时候,经常会碰到多个窗口的情况。有时候,我们需要将一个窗口中的用户输入信息反应到另一个窗口中去,这就涉及到窗口...

2009
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)

我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了。 我们只要创建简单的资源文件,通过...

3337
来自专栏Hadoop实操

如何使用Java调用CM的API动态配置Yarn资源池

用户在使用CDH集群大数据平台时会有需求在自己的统一管理平台上通过API接口能够动态的设置Yarn资源池,Cloudera Manager提供了丰富的API接口...

1872
来自专栏开发 & 算法杂谈

Hiredis源码阅读(二)

上一篇介绍了Hiredis中的同步api以及回复解析api,这里紧接着介绍异步api。异步api需要与事件库(libevent、libev、ae一起工作)。

4175
来自专栏大内老A

在ASP.NET MVC中通过URL路由实现对多语言的支持

对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如e...

2206
来自专栏pangguoming

C# 简单日志文本输出

第一种  直接文件IO流写日志文件 using System.IO; public static void WriteLog(string strLog) { ...

3395

扫码关注云+社区

领取腾讯云代金券