1

我已经为我的应用程序编写了几个 JUnit 类,但是我现在想将我的测试数据(现在是硬编码的)从代码中分离到一个纯数据文本文件/属性文件/xml/whatever 中。

所以我可以很容易地给出各种测试数据,而无需修改我的 JUnit。

我正在考虑将它们放在一个文本文件中,并在我的 JUnit 套件的最开始使用解析器来解析它,并将所有数据转换为 Java 静态类常量,这样我就可以轻松地在我的 JUnit 中的任何地方引用它.

public final class TestDataConstants {

public static final String username = "xbeta";
public static final String password = "test123!";
public static final String authToken = "f17bf9c8-9d38-47af-a053-210130cac6f7";
...
}

现在我知道我可以很容易地为此编写一个解析器,但我要问以前做过这件事的有经验的人 2 个问题

  1. 什么格式是最好的并且应该用于存储这些测试数据?
  2. 有哪些方法可以将这些测试数据文件转换为 Java 静态类?就像使用 Java 即时生成 Java 代码一样。

先谢谢了。

4

2 回答 2

1

一种方法是使用 .properties 文件,然后在测试开始时将其作为资源加载。

例如,

测试属性:

test.username=xbeta
test.password=test123!
test.authToken=f17bf9c8-9d38-47af-a053-210130cac6f7

然后在您的测试中,您可以使用以下内容访问数据,假设 test.properties 文件位于您的类路径中:

// note, the .properties is removed in the call to .getBundle
ResourceBundle testProperties = ResourceBundle.getBundle("test"); 
String username = testProperties.getString("test.username");
String password = testProperties.getString("test.password");
于 2012-05-31T23:15:32.883 回答
0

@DataProvider假设您将数据放在属性文件中,以下是如何使用 a 执行此操作:

public class A {

  @Test(dataProvider = "dp")
  public void test(String k, String v) {
    System.out.println("Testing " + k + " " + v);
    Assert.assertEquals(k.toUpperCase(), v);
  }

  @DataProvider
  public Object[][] dp() throws FileNotFoundException, IOException {
    Properties p = new Properties();
    p.load(new FileInputStream(new File("/tmp/a.properties")));
    List<Object[]> result = Lists.newArrayList();
    for (Map.Entry<Object, Object> es : p.entrySet()) {
      result.add(new Object[] { es.getKey(), es.getValue() });
    }
    return result.toArray(new Object[result.size()][]);
  }

  @Test(dataProvider = "dp")
  public void test(String k, String v) {
    System.out.println("Testing " + k + " " + v);
    Assert.assertEquals(k.toUpperCase(), v);
  }
}

属性文件:

abc: ABC
def: DEF
ghi: GHI

和输出:

Testing abc ABC
Testing def DEF
Testing ghi GHI
PASSED: test("abc", "ABC")
PASSED: test("def", "DEF")
PASSED: test("ghi", "GHI")

===============================================
    Test1
    Tests run: 3, Failures: 0, Skips: 0
===============================================

请注意,每组参数都会传递给测试方法(因此测试方法被调用了 3 次),并且该测试方法将这些参数声明为常规方法参数。

有关数据提供者的更多详细信息:http: //testng.org/doc/documentation-main.html#parameters-dataproviders

于 2012-06-01T05:24:24.130 回答