某些方法的正确设计

时间:2015-04-16 13:48:33

标签: java selenium testing

考虑你有一个班级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中调用这些函数的顺序。这一定是错的。

那么我应该消除fillDatadata.setField("fooField","fooValue);并执行这些函数在相应测试函数中的作用吗?

如果您考虑更多的测试函数将会存在,每个测试函数都使用不同的数据集进行测试,所有这些都必须手动填充(data)。

有人可能会给出一个通用的构造或想法,他会解释如何正确解决给定的任务吗?

现在我真的很想找到一种感觉很好的模式"并纠正。我目前所做的一定是错的。

编辑:值得一提的是测试功能不能通用。对于{{1}}的每个不同变体,必须考虑不同的结果。

3 个答案:

答案 0 :(得分:0)

那么,如果您在未先调用testWithDefaultValues()的情况下尝试拨打initialize(),会发生什么?您实际上不会使用默认值进行测试,您将使用先前设置的数据进行测试。我认为你应该放弃修改实际测试函数中的内部测试数据,或许还要有一个通用的测试函数data

如果testWithDefaultValues()testWithFilledData()实际上做同样的事情但数据不同,这很有意义。

我认为这样的事情更有意义:

Data testData = getTestData();
test(testData);
Data fillData = getFillData();
test(fillData);

答案 1 :(得分:0)

我相信你应该只填写一个方法,其中包含你想要实现的测试所需的所有代码。然后,您可以相应地填充variablesdata以进行测试,并为data设置不同的值,以便始终使用相同的方法运行不同的测试。

使用这个简单的结构,您可以创建多个测试方法,并且不会迷失在您的代码中。

修改

您应该始终考虑像黑盒测试一样的测试方法。如果您认为您不知道该方法中运行的代码是什么。您需要关心的只是您的inputoutput测试。

如果相同的方法应根据不同的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。或者您可以定制模板方法以添加更多钩子,以满足您的特定需求。重点是捕获模板方法中的公共过程,隔离一些钩子方法中的公共代码,并在其他钩子方法中提供独特的具体覆盖。