0

我编写了一个应用程序,通过 Internet 浏览器对我们的硬件进行单元测试。

我在程序集中有命令类,它们是单个 Web 浏览器操作的包装器,例如勾选复选框,从下拉框中进行选择:

BasicConfigurationCommands
EventConfigurationCommands
StabilizationCommands

和一组测试类,它们使用命令类来执行脚本测试:

ConfigurationTests
StabilizationTests

然后通过 GUI 调用这些,以运行我们的 QA 团队规定的测试。然而,由于固件在不同版本之间变化很快,如果开发人员可以编写一个可以调用测试或命令的 XML 文件,那就太好了:

<?xml version="1.0" encoding="UTF-8" ?> 
<testsuite>
    <StabilizationTests>
        <StressTest repetition="10" />
    </StabilizationTests>
    <BasicConfigurationCommands>
        <SelectConfig number="2" />
        <ChangeConfigProperties name="Weeeeee" timeOut="15000" delay="1000"/>
        <ApplyConfig />
    </BasicConfigurationCommands> 
</testsuite>

我一直在看这System.Reflection门课,并看到了使用GetMethodthen的例子Invoke。这要求我在编译时创建类对象,我想在运行时完成所有这些

我需要扫描整个程序集的类名,然后扫描类中的方法。

这似乎是一个很大的解决方案,所以任何指向我(以及这​​篇文章的未来读者)答案的信息都会很棒!

谢谢阅读,

马特

4

1 回答 1

2

要查找程序集中的所有类:

public Type FindClass(string name)
{
   Assembly ass = null;
   ass = Assembly.Load("System.My.Assembly"); // Load from the GAC
   ass = Assembly.LoadFile(@"c:\System.My.Assembly.dll"); // Load from file
   ass = Assembly.LoadFrom("System.My.Assembly"); // Load from GAC or File

   foreach(Type t in ass.GetTypes())
   {
      if (t.Name == name)
         return t;
   }

   return null;
}

实际上,您应该使用属性标记您的类,这使它们更容易被发现。

要实例化所述类的实例:

public T Instantiate<T>(Type typ, object[] arguments)
{
    return (T)Activator.CreateInstance(typ, arguments, null);
}

不要忘记,您可能应该用适当的 try/catch 块包装它们

然后在一个类上找到一个方法

Type t = FindClass("MyType");
MethodInfo meth = t.GetMethod("TestSomething", typeof(string), typeof(int)); // finds public ??? TestSomething(string, int)

只需在 VStudio 中使用对象浏览器并学习反射类,您可以做很多事情。

于 2010-05-13T16:02:10.027 回答