你能以编程方式调用一个方法,就好像它是一个类字段?

时间:2014-08-22 15:20:42

标签: c# class oop testing

我正在为我的程序编写一个自动化测试套件,并且一直在寻找简化和重新考虑大量代码的方法。

目前,我有许多try / catch块(因为我希望能够从一个测试移动到下一个测试,即使在失败的情况下),否则可以记录信息。看起来有点像这样:

try
{
    PerformTest1();
}
catch(Exception e)
{
    file.WriteLine("Unable to perform test number 1.");
    file.WriteLine("Error: " + e.Message);
    file.WriteLine("StackTrace: " + e.StackTrace);
}

try
{
    PerformTest2();
}
catch(Exception e)
{
    file.WriteLine("Unable to perform test number 2.");
    file.WriteLine("Error: " + e.Message);
    file.WriteLine("StackTrace: " + e.StackTrace);
}

等等。我想知道我是否可以制作这些测试的数组,所以我可以使用循环。类似的东西:

foreach(Test t in testsArray)
{
    try
    {
        t.RunTest();
    }
    catch(Exception e)
    {
        file.WriteLine(t.failDescription);
        file.WriteLine("Error: " + e.Message);
        file.WriteLine("StackTrace: " + e.StackTrace);
    }
}

如何执行此操作,但不使每个测试都是自己的类(使用RunTest()方法)?我正在考虑制作一个具有必要字段的测试类,其中一个是方法。然后我可以创建一个测试对象,并调用该对象方法。这样的事情甚至可能吗?或者我必须制作多个测试类?

4 个答案:

答案 0 :(得分:2)

您需要一个带有Test方法的runTest()接口,但您可以使用匿名类或lambda表达式(如果您使用的是Java 8)实现逻辑,这将节省您的需要为每个测试创建一个显式类。

示例:

Test test1 = new Test () {
    public void runTest () {
    // logic of first test here
    }
};

实际上,您不需要创建自己的界面。使用现有Runnable接口及其run()方法。

Runnable test1 = new Runnable () {
    public void run () {
    // logic of first test here
    }
};

或使用lambda表达式:

Runnable test1 = () -> {
                        // logic of first test here
                       };

然后,您可以将这些Runnable中的每一个添加到列表(或数组)中,并按照您的需要在循环中运行它们:

for (Runnable test in testsArray)
{
    try {
       test.run();
    }
    catch(Exception e)
    {
       ...
    }
} 

答案 1 :(得分:1)

您可以使用一些Lambda技巧:

var actions = new List<Action>();
actions.Add(PerformTest1);  // requires a void PerformTest1() method
actions.Add(PerformTest2);
//...  and so on...

然后最终解雇所有行动:

foreach(var action in actions)
{
   action();
}

答案 2 :(得分:0)

public interface Testable {
    void doTest();
}
public class Test1 implements Testable {
    // implement doTest()
}
private static Testable[] testables = new Testabable[] {
    new Test1()
};
// now iterate your testables and call doTest()

好吧,好像是老派,但这是第一件事,人们应该学习接口。

答案 3 :(得分:0)

您是否研究过.Net / Java的可用测试框架?我相信Nunit(或JUnit)提供了您正在寻找的大部分功能,包括在发生故障时写出堆栈跟踪和异常详细信息。

还可以在测试夹具中封装多个测试,因此您可以在发生故障后仍然执行后续测试,而不会在各个测试之间出现数据或状态。