考虑你有一个班级RunMe
。顾名思义它是由另一个类运行的。让我们通过RunMe.run()
。
RunMe
有一个私有变量,其中包含用于运行不同测试的数据,我们可以调用ist data
。
我们假设此数据由RunMe.initialize()
初始化。
之后,在run()
方法中,第一个测试运行时使用initialize
data
函数为testWithDefaultValues
设置的默认值。我们称之为测试方法data
。
我们现在想用fillData
填充一些自定义数据。我们假设我们使用testWithFilledData
执行此操作。
然后我们想要使用新填充的数据执行另一个测试。让我们调用此测试public void run() {
initialize();
testWithDefaultValues();
fillData();
testWithFilledData();
}
。
此时我们的run-method看起来像这样
testWithFilledData()
你能看到这段代码的外观吗?看起来和感觉都错了。我直接想到的一件事:testWithDefaultValues()
或run
实际上正在做名称所假设的唯一原因是因为initialize
中调用这些函数的顺序。这一定是错的。
那么我应该消除fillData
和data.setField("fooField","fooValue);
并执行这些函数在相应测试函数中的作用吗?
如果您考虑更多的测试函数将会存在,每个测试函数都使用不同的数据集进行测试,所有这些都必须手动填充(data
)。
有人可能会给出一个通用的构造或想法,他会解释如何正确解决给定的任务吗?
现在我真的很想找到一种感觉很好的模式"并纠正。我目前所做的一定是错的。
编辑:值得一提的是测试功能不能通用。对于{{1}}的每个不同变体,必须考虑不同的结果。
答案 0 :(得分:0)
那么,如果您在未先调用testWithDefaultValues()
的情况下尝试拨打initialize()
,会发生什么?您实际上不会使用默认值进行测试,您将使用先前设置的数据进行测试。我认为你应该放弃修改实际测试函数中的内部测试数据,或许还要有一个通用的测试函数data
。
如果testWithDefaultValues()
和testWithFilledData()
实际上做同样的事情但数据不同,这很有意义。
我认为这样的事情更有意义:
Data testData = getTestData();
test(testData);
Data fillData = getFillData();
test(fillData);
答案 1 :(得分:0)
我相信你应该只填写一个方法,其中包含你想要实现的测试所需的所有代码。然后,您可以相应地填充variables
或data
以进行测试,并为data
设置不同的值,以便始终使用相同的方法运行不同的测试。
使用这个简单的结构,您可以创建多个测试方法,并且不会迷失在您的代码中。
修改强>
您应该始终考虑像黑盒测试一样的测试方法。如果您认为您不知道该方法中运行的代码是什么。您需要关心的只是您的input
和output
测试。
如果相同的方法应根据不同的output
生成不同的input
。黑盒内的代码保持不变。
但是,如果您的方法需要与input
进行不同的交互以生成您需要的output
,那么您需要考虑编写不同的测试。
我的两分钱,希望有所帮助
答案 2 :(得分:0)
我建议使用Template Method设计模式来创建测试框架。您可能最好使用像JUnit这样的成熟测试框架。
public abstract class TestCase {
// This is the template method.
public final boolean execute() {
initTest();
return runTest();
}
// Init hook method.
public abstract void initTest();
// Test logic hook method.
public abstract boolean runTest();
}
public abstract class BaseTest extends TestCase {
public boolean runTest() {
// This is the common execution for different data sets...
}
}
public Test1 extends BaseTest {
public void initTest() {
// Data init for test 1...
}
}
您可以为每个测试数据集扩展BaseTest
。要运行测试:
new Test1().execute();
new Test2().execute();
编辑:如果您没有共同的测试逻辑,您当然可以跳过BaseTest
。或者您可以定制模板方法以添加更多钩子,以满足您的特定需求。重点是捕获模板方法中的公共过程,隔离一些钩子方法中的公共代码,并在其他钩子方法中提供独特的具体覆盖。