我对编程语言很陌生。我的问题甚至没有道理。我的环境正在使用Java,并试图在同一自动化测试框架中同时实现ios和android应用。 因此,想法是任何测试脚本都应该能够在两个应用程序上运行。例如:一个登录测试脚本应同时在ios和android上运行。 我决定使用接口和类实现方法。我面临的问题是测试数据。我的公司不想使用excel。他们想将json用于测试数据。
这是我的问题,请看下面的代码行:
ValidBuy goodBuy = JsonFileReader.loadDaTa(TestBase.DATA_PATH, "good-buy.json", ValidBuy.class);
您可以看到我有一个“ ValidBuy”类,其中包含特定json文件的所有获取器。我还有另一个类“ JsonFileReader”,它将json filePath,fileName和一个类作为输入,并返回我传入的该类名称的数据。对于此示例,我已经传递了ValidBuy.class
因此,当我运行阳性测试时,我正在传递类型为“ ValidBuy”的“ goodBuy”变量。问题从这里开始。 现在,用来自goodBuy的数据指定了测试用例,因为它的类型是“ ValidBuy”,并且我要传递goodBuy作为参数。
看看我提取的方法之一:
private void enterBuyInfo(ValidBuy goodBuy) {
itemPage = nativeApp.getItemPage(goodBuy);
itemPage.setItemName(goodBuy.getItemName());
itemPage.setItemSize(goodBuy.getItemSize());
itemPage.setItemDigitSSN(goodBuy.getSsn());
itemPage.clickContinue();
}
您可以看到我正在使用的那些getter来自ValidBuy类。 如果我使用badBuy的数据运行此测试:
InvalidBuy badBuy = JsonFileReader.loadDaTa(TestBase.DATA_PATH, "bad-buy.json", InvalidBuy.class);
它失败了,因为现在我必须将“ ValidBuy”类更改为“ InvalidBuy”类。既然无法在每次运行中更改提取方法中的参数,那么如何使它更通用?
我想要这样的东西:
TestData data = JsonFileReader.loadDaTa(RESOURCES_PATH, "good-client.json", InvalidBuy.class);
此处,TestData是通用的。它可以是类,也可以是接口(我不知道是否可行),返回类型将由我传递给loadData()方法的任何类指定。在这种情况下,InvalidBuy.class
The extracted method should look like this:
private void enterBuyInfo(TestData data) {
itemPage = nativeApp.getItemPage(data);
itemPage.setItemName(data.getItemName());
itemPage.setItemSize(data.getItemSize());
itemPage.setItemDigitSSN(data.getSsn());
itemPage.clickContinue();
}
如果可以,我可以使用这些提取的方法来创建更多测试。
我知道我写了很多。我只是试图使其尽可能清楚。如果没有任何意义,请忽略它。
任何建议,想法和代码示例都将受到高度赞赏。
答案 0 :(得分:0)
首先让我看看我是否理解您的问题。我想您是说loadData
可能返回类型ValidBuy
或InvalidBuy
的值,并且您想将要返回的类传递给它。然后,您想知道如何在测试方法中使用可能表示这些类之一的接口,以便可以测试各种返回值(有效值和无效值)。您在问题中使用了“泛型”一词,但我想您并不是要以Java中使用的特定方式来使用它。
如果我正确理解了您的问题,那么这里是一个答案:
将您希望返回的类传递给方法是一种不寻常的用法,几乎可以肯定是不理想的。更好的OOD方法是将loadData
返回的所有对象的通用方法提取到接口中。
所以:
interface Buy {
String getItemName();
boolean isValid();
}
class ValidBuy implements Buy {
@Override
public boolean isValid() {
return true;
}
...
}
class InvalidBuy implements Buy {
@Override
public boolean isValid() {
return false;
}
...
}
class JsonFileReader {
Buy loadData(Path path) {
...
}
}
然后您的测试如下所示:
@Test
void testValidBuy() {
assertTrue(reader.loadData(validPath).isvalid());
}
@Test
void testInvalidBuy() {
assertFalse(reader.loadData(invalidPath).isValid());
}
我意识到我已经对其进行了一些简化,但是希望您能理解。