Как запустить NUnit программно - PullRequest
17 голосов
/ 12 октября 2008

У меня есть какая-то сборка, которая ссылается на NUnit и создает один тестовый класс с одним тестовым методом. Я могу получить путь файловой системы к этой сборке (например, "C: ... \ test.dll"). Я хотел бы программно использовать NUnit для запуска с этой сборкой.

Пока у меня есть:

var runner = new SimpleTestRunner();
runner.Load(path);
var result = runner.Run(NullListener.NULL);

Однако при вызове runner.Load (путь) генерируется исключение FileNotFound. По трассировке стека я вижу, что проблема в том, что NUnit вызывает Assembly.Load (путь) вниз по стеку. Если я изменю путь на что-то вроде «Test, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null», то я все равно получу ту же ошибку.

Я добавил обработчик событий в AppDomain.Current.AssemblyResolve, чтобы посмотреть, смогу ли я разрешить этот тип вручную, но мой обработчик никогда не вызывается.

В чем секрет работы Assembly.Load (...) для работы ??

Ответы [ 2 ]

29 голосов
/ 16 января 2009

Если вы хотите открыть в режиме консоли , добавьте ссылку nunit-console-runner.dll и используйте:

NUnit.ConsoleRunner.Runner.Main(new string[]
   {
      System.Reflection.Assembly.GetExecutingAssembly().Location, 
   });

Если вы хотите открыть в режиме графического интерфейса , добавьте nunit-gui-runner.dll и используйте ссылку:

NUnit.Gui.AppEntry.Main(new string[]
   {
      System.Reflection.Assembly.GetExecutingAssembly().Location, 
      "/run"
   });

Это лучший подход, потому что вам не нужно указывать какой-либо путь.

Другой вариант также заключается в интеграции бегуна NUnit в выходные данные отладчика Visual Studio:

public static void Main()
{
    var assembly = Assembly.GetExecutingAssembly().FullName;
    new TextUI (new DebugTextWriter()).Execute(new[] { assembly, "-wait" });
}

public class DebugTextWriter : StreamWriter
{
    public DebugTextWriter()
        : base(new DebugOutStream(), Encoding.Unicode, 1024)
    {
        this.AutoFlush = true;
    }

    class DebugOutStream : Stream
    {
        public override void Write(byte[] buffer, int offset, int count)
        {
            Debug.Write(Encoding.Unicode.GetString(buffer, offset, count));
        }

        public override bool CanRead { get { return false; } }
        public override bool CanSeek { get { return false; } }
        public override bool CanWrite { get { return true; } }
        public override void Flush() { Debug.Flush(); }
        public override long Length { get { throw new InvalidOperationException(); } }
        public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); }
        public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); }
        public override void SetLength(long value) { throw new InvalidOperationException(); }
        public override long Position
        {
            get { throw new InvalidOperationException(); }
            set { throw new InvalidOperationException(); }
        }
    };
}
3 голосов
/ 12 октября 2008

«В чем секрет того, как заставить Assembly.Load работать?»

System.Reflection.Assembly.Load принимает строку, содержащую имя сборки, а не путь к файлу.

Если вы хотите загрузить сборку из файла, используйте:

Assembly a = System.Reflection.Assembly.LoadFrom(pathToFileOnDisk);

(LoadFrom фактически использует Assembly.Load внутри)

Кстати, есть ли причина, по которой вы не можете: * использовать инструмент командной строки NUnit-Console и просто передать ему путь к тестовой сборке? Затем вы можете просто использовать System.Diagnostics.Process для запуска этого из вашего клиентского приложения, может быть проще?

...