现在的位置: 首页 > 综合 > 正文

用Nunit测试通讯程序

2012年01月30日 ⁄ 综合 ⁄ 共 2270字 ⁄ 字号 评论关闭
    对于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(50085005003new Dele_ConnsNotify(mynoti), 437437);
            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的调试。

抱歉!评论已关闭.