我有一个包含测试用例的nunit类库。我想以编程方式获取库中所有测试的列表,主要是测试名称及其测试ID。以下是我到目前为止的情况:
var runner = new NUnit.Core.RemoteTestRunner();
runner.Load(new NUnit.Core.TestPackage(Request.PhysicalApplicationPath + "bin\\SystemTest.dll"));
var tests = new List<NUnit.Core.TestResult>();
foreach (NUnit.Core.TestResult result in runner.TestResult.Results)
{
tests.Add(result);
}
问题是,在实际运行测试之前,runner.TestResult为null。我显然不想在此时运行测试,我只想获得库中哪些测试的列表。之后,我将让用户能够选择测试并单独运行它,将测试ID传递给RemoteTestRunner实例。
那么如何在不实际运行所有测试的情况下获取测试列表呢?
答案 0 :(得分:6)
您可以使用反射来加载程序集并查找所有test属性。这将为您提供所有测试方法的方法。其余的由你决定。
这是msdn关于使用反射来获取类型属性的示例。 http://msdn.microsoft.com/en-us/library/z919e8tw.aspx
答案 1 :(得分:4)
以下是从测试类库程序集中检索所有测试名称的代码:
//load assembly.
var assembly = Assembly.LoadFile(Request.PhysicalApplicationPath + "bin\\SystemTest.dll");
//get testfixture classes in assembly.
var testTypes = from t in assembly.GetTypes()
let attributes = t.GetCustomAttributes(typeof(NUnit.Framework.TestFixtureAttribute), true)
where attributes != null && attributes.Length > 0
orderby t.Name
select t;
foreach (var type in testTypes)
{
//get test method in class.
var testMethods = from m in type.GetMethods()
let attributes = m.GetCustomAttributes(typeof(NUnit.Framework.TestAttribute), true)
where attributes != null && attributes.Length > 0
orderby m.Name
select m;
foreach (var method in testMethods)
{
tests.Add(method.Name);
}
}
答案 2 :(得分:1)
贾斯汀的回答对我不起作用。以下内容(检索具有Test
属性的所有方法名称):
Assembly assembly = Assembly.LoadFrom("pathToDLL");
foreach (Type type in assembly.GetTypes())
{
foreach (MethodInfo methodInfo in type.GetMethods())
{
var attributes = methodInfo.GetCustomAttributes(true);
foreach (var attr in attributes)
{
if (attr.ToString() == "NUnit.Framework.TestAttribute")
{
var methodName = methodInfo.Name;
// Do stuff.
}
}
}
}