8

我有一个包含测试用例的 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 在您实际运行测试之前为空。我显然不想在这一点上运行测试,我只想获取库中哪些测试的列表。之后,我将让用户能够选择一个测试并单独运行它,将测试 ID 传递给 RemoteTestRunner 实例。

那么如何在不实际运行所有测试的情况下获得测试列表呢?

4

3 回答 3

6

您可以使用反射来加载程序集并查找所有测试属性。这将为您提供所有作为测试方法的方法。剩下的就看你了。

这是 msdn 上有关使用反射获取类型属性的示例。 http://msdn.microsoft.com/en-us/library/z919e8tw.aspx

于 2012-05-23T17:05:20.860 回答
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);
                }
            }
于 2012-05-23T18:04:08.470 回答
2

贾斯汀的回答对我不起作用。以下内容(检索具有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.
            }
        }
    }
}
于 2017-05-02T08:09:04.890 回答