在VS2010 Express中调试Nunit测试

9

我在VS2010 Express中编写了一堆单元测试,但是测试有时会失败。由于VS的express版本不允许插件运行,因此我无法像使用TestDriven.Net或类似工具来调试测试。为了解决这个问题,我将我的测试程序集转换为控制台应用程序,并使主方法看起来像这样:

class CrappyHackToDebugUnitTestInVSExpress
{
  public static void Main()
  {
     AppDomain.CurrentDomain.ExecuteAssemblyByName(
          @"C:\Program Files\NUnit 2.5.5\bin\net-2.0\nunit-console.exe",
          new [] { Assembly.GetExecutingAssembly().Location, "/framework:4.0" });
  }
}

理论上我应该能够运行这个程序,在我的测试中设置断点。如果它能够正常工作,那么这将是一个可接受的解决方案,但是我一直收到以下错误信息:

FileLoadException
Could not load file or assembly 'C:\\Program Files\\NUnit 2.5.5\\bin\\net-2.0\\nunit-console.exe' 
or one of its dependencies. The given assembly name or codebase was invalid. 
(Exception from HRESULT: 0x80131047)

现在文件已存在,手动运行nunit-console也能正常运行。我的问题可能是什么?

为什么不直接附加到NUnit GUI运行器? - Piotr Perak
1
在Visual Studio Express中无法执行“附加进程”操作。 - user181813
3个回答

7

基本上,您需要将您的汇编转换为Windows Forms应用程序,添加对nunit-gui-runner.dll程序集的引用,并更改您的Main方法如下所示:

    [STAThread]
    static void Main()
    {
        NUnit.Gui.AppEntry.Main(new string[] { Assembly.GetExecutingAssembly().Location });
    }

这是另一个例子:
...
using NUnit.Gui;

namespace __libs
{
    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            NUnit.Gui.AppEntry.Main(new string[] { @"C:\test\bin\Debug\test.exe" });
        }
    }
}

这将允许您进入某些测试,但不适用于红绿循环,因此只有在调试时才应使用,而不是在其他情况下。


如果您在新项目中遇到运行时错误,请检查Main是否作为[STAThread]运行。如果不是,NUnit GUI无法加载。 - Johannes
这很棒。我们的代码行如下:NUnit.Gui.AppEntry.Main(new string[] { @"Test.exe", "/run" });,为了避免硬编码路径(NUnit 无论如何都会看到它),并在加载时自动运行它。 - javs

6

我尝试过你的概念,似乎问题并不是直接从加载文件中出现,而是来自依赖项。

我使用了以下修改后的代码:

实际上错误是无法找到nunit.core.dll,它位于/lib目录中。

 try
        {
            String NUnitPath = @"C:\Program Files\NUnit 2.5.7\bin\net-2.0\nunit-console.exe";

            AssemblyName asmName = System.Reflection.AssemblyName.GetAssemblyName(NUnitPath);

            AppDomain.CurrentDomain.ExecuteAssemblyByName(asmName, new[] { Assembly.GetExecutingAssembly().Location, "/framework:4.0" });

        }
        catch (Exception ex)
        {
            Trace.WriteLine(ex.Message);
            Trace.WriteLine(ex.StackTrace);
        }

我喜欢获取 System.Reflection.AssemblyName,因为你可以检查并确认一切都是有序的,而不是使用原始文件路径。将 nunit.*.dll 批量复制(xcopy nunit.*.dll)到我的测试项目的调试目录中后,它就可以正常运行了。(应该很容易发现所需的最小依赖项)在 VC# 2010 Express 中测试过,使用 NUnit 2.5.7(断点工作正常,但我没有尝试其他选项)。虽然我相信你可以从中制作出一个可接受的构建选项。干杯!PS - 这是我在这里发布的第一篇文章,所以我对“代码”块的格式化还有些不熟悉。提前抱歉。

2
我曾经在VS C# Express中尝试调试单元测试时遇到类似的问题。我花了很长时间才使其正常工作,但后来我发现了这个项目模板。在C# Express中完美运行! http://visualstudiogallery.msdn.microsoft.com/b8a7a8fa-9f5a-4b9b-8e8b-8839a4364f26?SRC=VSIDE C#项目模板 集成Visual Studio的测试,包括Visual C# Express版本 自包含的NUnit控制台运行程序。允许编写测试夹具和测试,只需按F5键(支持测试调试)或Ctrl-F5自由运行,并在控制台窗口中显示结果。如果测试失败,则会发出嘟嘟声。 包含必要的NUnit模块以启动测试项目。没有外部依赖项。只需使用NUnit测试应用程序模板创建新项目即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接