我正在为我的程序编写一个自动化测试套件,并且一直在寻找简化和重新考虑大量代码的方法。
目前,我有许多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()方法)?我正在考虑制作一个具有必要字段的测试类,其中一个是方法。然后我可以创建一个测试对象,并调用该对象方法。这样的事情甚至可能吗?或者我必须制作多个测试类?
答案 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)提供了您正在寻找的大部分功能,包括在发生故障时写出堆栈跟踪和异常详细信息。
还可以在测试夹具中封装多个测试,因此您可以在发生故障后仍然执行后续测试,而不会在各个测试之间出现数据或状态。