DefaultTestAssemblyBuilder
DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite
containing test fixtures present in the assembly.
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal;
using NUnit.Framework.Internal.Builders;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
namespace NUnit.Framework.Api
{
public class DefaultTestAssemblyBuilder : ITestAssemblyBuilder
{
private static Logger log = InternalTrace.GetLogger(typeof(DefaultTestAssemblyBuilder));
private Assembly assembly;
private ISuiteBuilder _defaultSuiteBuilder;
public DefaultTestAssemblyBuilder()
{
_defaultSuiteBuilder = new DefaultSuiteBuilder();
}
public ITest Build(Assembly assembly, IDictionary options)
{
log.Debug("Loading {0} in AppDomain {1}", assembly.FullName, AppDomain.CurrentDomain.FriendlyName);
string assemblyPath = AssemblyHelper.GetAssemblyPath(assembly);
return Build(assembly, assemblyPath, options);
}
public ITest Build(string assemblyName, IDictionary options)
{
log.Debug("Loading {0} in AppDomain {1}", assemblyName, AppDomain.CurrentDomain.FriendlyName);
TestSuite testSuite = null;
try {
Assembly assembly = Load(assemblyName);
return Build(assembly, assemblyName, options);
} catch (Exception ex) {
testSuite = new TestAssembly(assemblyName);
testSuite.RunState = RunState.NotRunnable;
testSuite.Properties.Set("_SKIPREASON", ex.Message);
return testSuite;
}
}
private TestSuite Build(Assembly assembly, string assemblyPath, IDictionary options)
{
this.assembly = assembly;
TestSuite testSuite = null;
try {
IList names = options["LOAD"] as IList;
IList fixtures = GetFixtures(assembly, names);
return BuildTestAssembly(assembly, assemblyPath, fixtures);
} catch (Exception ex) {
testSuite = new TestAssembly(assemblyPath);
testSuite.RunState = RunState.NotRunnable;
testSuite.Properties.Set("_SKIPREASON", ex.Message);
return testSuite;
}
}
private Assembly Load(string path)
{
Assembly assembly = null;
AssemblyName assemblyName = AssemblyName.GetAssemblyName(path);
assembly = Assembly.Load(assemblyName);
log.Info("Loaded assembly " + assembly.FullName);
return assembly;
}
private IList GetFixtures(Assembly assembly, IList names)
{
List<Test> list = new List<Test>();
log.Debug("Examining assembly for test fixtures");
IList candidateFixtureTypes = GetCandidateFixtureTypes(assembly, names);
log.Debug("Found {0} classes to examine", candidateFixtureTypes.Count);
int num = 0;
foreach (Type item in candidateFixtureTypes) {
if (_defaultSuiteBuilder.CanBuildFrom(item)) {
Test test = _defaultSuiteBuilder.BuildFrom(item);
list.Add(test);
num += test.TestCaseCount;
}
}
log.Debug("Found {0} fixtures with {1} test cases", list.Count, num);
return list;
}
private IList GetCandidateFixtureTypes(Assembly assembly, IList names)
{
IList types = assembly.GetTypes();
if (names == null || names.Count == 0)
return types;
List<Type> list = new List<Type>();
foreach (string name in names) {
Type type = assembly.GetType(name);
if (type != (Type)null)
list.Add(type);
else {
string value = name + ".";
foreach (Type item in types) {
if (item.FullName.StartsWith(value))
list.Add(item);
}
}
}
return list;
}
private TestSuite BuildTestAssembly(Assembly assembly, string assemblyName, IList fixtures)
{
TestSuite testSuite = new TestAssembly(assembly, assemblyName);
if (fixtures.Count == 0) {
testSuite.RunState = RunState.NotRunnable;
testSuite.Properties.Set("_SKIPREASON", "Has no TestFixtures");
} else {
NamespaceTreeBuilder namespaceTreeBuilder = new NamespaceTreeBuilder(testSuite);
namespaceTreeBuilder.Add(fixtures);
testSuite = namespaceTreeBuilder.RootSuite;
}
testSuite.ApplyAttributesToTest(assembly);
testSuite.Properties.Set("_PID", Process.GetCurrentProcess().Id);
testSuite.Properties.Set("_APPDOMAIN", AppDomain.CurrentDomain.FriendlyName);
testSuite.Sort();
return testSuite;
}
}
}