代码之家  ›  专栏  ›  技术社区  ›  ilivewithian

在VS2010 Express中调试nunit测试

  •  9
  • ilivewithian  · 技术社区  · 14 年前

    我在VS2010 Express中编写了许多单元测试,这些测试有时会失败。因为vs的Express版本不允许运行插件,所以我不能简单地启动testsdriven.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)
    

    现在文件已经存在,当手动运行时,unnit控制台运行正常。我的问题可能是什么?

    3 回复  |  直到 10 年前
        1
  •  6
  •   Andre White    14 年前

    我讨论过你的概念,问题似乎不是直接从加载文件开始的,而是从依赖关系开始的。

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

    这个错误实际上是找不到位于/lib目录下的nunit.core.dll。

     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,因为您可以检查并查看所有内容的顺序是否与原始文件路径一致。)

    一个快速的大容量复制(xcopy nunit.*.dll)到我的测试项目的调试目录中,它运行得很好。(发现所需的最小依赖关系应该很简单)

    使用Nunit 2.5.7在VC_2010 Express中进行了测试(断点有效,但我没有真正使用任何其他选项),不过我相信您可以从中获得一个可通过的构建选项。

    干杯!

    PS-这里是第一篇文章,所以我对“代码”块的格式还没有进行测试。对不起,提前……

        2
  •  7
  •   Dmitry Osinovskiy    10 年前

    基本上,您需要将程序集转换为Windows窗体应用程序,并将引用添加到 nunit-gui-runner.dll文件 组装并更改您的主要方法,如下所示:

        [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" });
            }
        }
    }
    

    这将允许您单步执行某些测试,但对于红绿循环不是很好,因此您只希望在调试时使用它,而不希望在其他情况下使用它。

        3
  •  2
  •   Borundin    12 年前

    我在尝试调试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(支持测试)即可从Visual Studio运行 调试),或在控制台窗口中自由运行ctrl-f5。在 如果测试失败,则发出蜂鸣音。

    包含启动测试项目所必需的nunit模块。无外部 依赖关系。只需使用nunit测试应用程序创建新项目 模板。