这是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);
}
|
阅读(869) | 评论(0) | 转发(0) |