Выполнение модульных тестов Visual Studio 2008 C # (на основе MSTest.exe) в Mono - PullRequest
4 голосов
/ 09 августа 2009

Я использую VS2008 для разработки проекта, который я начинаю тестировать под Mono. Существует ряд модульных тестов, написанных с использованием среды модульных тестов VS. Существует ли инструмент, позволяющий мне запускать их в Mono?

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 августа 2009

В зависимости от того, какие функции вы используете, оно может быть тривиальным или сложным. Вы можете использовать пространство имен / псевдонимы типов, чтобы использовать другую библиотеку классов для выполнения утверждений и атрибутов. Я написал консольные программы, которые запускают тесты вручную, но, конечно, у меня был доступ к пространствам имен и сборкам vs.

Для моно - я бы предложил использовать другую тестирующую систему в целом, так как делать это самостоятельно с пространством имен system.reflection для загрузки сборки, отражать атрибуты и выполнять, как вам нужно, будет утомительно.

Например:

Pseudo code:

var assembly = loadAsembly(....)
foreach(type in assembly.types) {
 if(type is static class and had method with AssemblyInitialiseAttrubute)){
    InvokeTheMethod(method);
 }
}

foreach(type in assembly.types) {
 if(type is not class and had method with TestClass)){
    InvokeTheMethod(method);
 }
 foreach(method in type with ClassinitialiseAttribute)
}
... etc
0 голосов
/ 17 августа 2018

Я написал следующий код, и он хорошо работает на Mono. Код НЕ имеет никакой зависимости от библиотеки DLL тестового набора Visual Studio. Удивительно, но он работает немного быстрее в Mone (работает на VirtualBox на моем ПК), чем в Visual Studio.

</p> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.IO; namespace drvrapp { public class TestRunner { // assembly file (e.g. MyTestAssembly.dll) which should be in the same directory public static void TestDll(string assemblyFile) { string symbolsFile = Path.GetFileNameWithoutExtension(assemblyFile) + ".pdb"; byte[] assemblyBytes = File.ReadAllBytes(assemblyFile); byte[] symbolsBytes = File.ReadAllBytes(symbolsFile); Assembly assembly = Assembly.Load(assemblyBytes, symbolsBytes); foreach (Type type in assembly.GetTypes()) if (HasAttribute(type, "TestClass")) foreach (MethodInfo method in type.GetMethods()) if (HasAttribute(method, "TestMethod")) RunTest(method); } private static void RunTest(MethodInfo method) { Console.WriteLine("------------------------------------------------------------------------------------------"); Console.Write("Running {0}.{1}...", method.DeclaringType.Name, method.Name); if (HasAttribute(method, "Ignore")) { Console.WriteLine("IGNORED"); return; } try { Type testType = method.DeclaringType; object typeClassInstance = Activator.CreateInstance(testType); RunInitializeOrCleanup(typeClassInstance, "TestInitialize"); method.Invoke(typeClassInstance, null); RunInitializeOrCleanup(typeClassInstance, "TestCleanup"); Console.WriteLine("PASSED"); } catch (Exception e) { Console.WriteLine(); Console.WriteLine(e); } } private static void RunInitializeOrCleanup(object instance, string attribute) { MethodInfo method = instance.GetType().GetMethods().SingleOrDefault(x => HasAttribute(x, attribute)); if (method != null) method.Invoke(instance, null); } private static bool HasAttribute(MemberInfo info, string attributeName) { return info.GetCustomAttributes(false).Any(x => x.GetType().Name == attributeName + "Attribute"); } } }

...