Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315245
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-06-19 16:30:03


这是DLL 中导出的函数, 给是UnitTest++的入口函数.

我希望在C#中通过 TestDriven.NET可以一键调用C++中的所有 UnitTest++测试.

但是, TestDriven.NET不能正确捕获来自native代码中的stdout, stderr输出, 从而显示在output窗口中, 它可以正确截获C#代码中通过 Console.WriteLine, Trace.WriteLine的输出.

由于单独开发C++模块的需要, 我们有另一个C++写的小小的单元测试驱动程序, 目的是调用上面的CPPUnitTest, 给一个测试名字, 就可以运行指定的测试. 如果传NULL就运行所有测试.

类似于 Nunit的 /run= 参数的功能.

通过在C#中调用这个单独的进程, 可以做到调用C++的输出, 但是, 重定向测试进程时, 不能简单地重定向完之后, ReadToEnd, 这样会出现一种情况, 如果你要查看C++单元测试的输出, 不能在程序一输出时马上看到, 得等整个程序全部运行结束后才能一古脑看到, 而且, 对于stdout, stderr交替输出也不能正确处理.

正确的办法用输出通知事件:


[Test(Description = "run C++ unit test")]
public void Test_CPP_UnitTestPlusPlus()
{
    Assembly assem = Assembly.GetExecutingAssembly();
    string native_unit_test_fname = Path.Combine(Path.GetDirectoryName(assem.Location),
                         @"UnitTestDriver.exe");
    ProcessStartInfo psi = new ProcessStartInfo(native_unit_test_fname);
    Process proc = new Process();
    proc.StartInfo = psi;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.Arguments = Kernel.c_KernelDllName;
    Test_Kernel s_lock_obj = new Test_Kernel();
    DataReceivedEventHandler StdoutDataReceived = delegate(object sender, DataReceivedEventArgs e)
    {
    lock (s_lock_obj)
    {
     Console.WriteLine(e.Data);
    }
    };
    DataReceivedEventHandler StdErrDataReceived = delegate(object sender, DataReceivedEventArgs e)
    {
    lock (s_lock_obj)
    {
     Console.Error.WriteLine(e.Data);
    }
    };
    proc.OutputDataReceived += StdoutDataReceived;
    proc.ErrorDataReceived += StdErrDataReceived;
    proc.Start();
    proc.BeginOutputReadLine();
    proc.BeginErrorReadLine();
    proc.WaitForExit();
    Assert.AreEqual(0, proc.ExitCode);
}

阅读(822) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~