gpt4 book ai didi

java - JUnit 测试 - 进行测试的最佳且最可靠的方法?

转载 作者:行者123 更新时间:2023-12-01 13:13:06 27 4
gpt4 key购买 nike

我正在使用 JUnit 测试我的 Android 应用程序。这是我第一次真正进行 JUnit 测试,所以我不知道应该遵循的路径。现在我正在测试对联系人列表的查询。许多方法只需要 Raw Contact IDContact ID 作为参数,并且大多数方法返回 JSON 对象JSON ArrayArrayList

我的问题是,我应该如何比较我的预期结果和实际结果?

现在我正在像这样测试它们:

public void testGetRelationship() {
JSONArray jsonArrayActual = new JSONArray();
JSONArray jsonArrayExpected = new JSONArray();

try {
jsonArrayExpected = contact.getRelationship(RAW_CONTACT_ID);
} catch (JSONException e) {
e.printStackTrace();
fail("Failed when calling the getRelationship method. " + e.getMessage());
}

Cursor cursor = getContext().getContentResolver().query(Data.CONTENT_URI,
new String[]{Relation.NAME, Relation.TYPE, Relation._ID, Relation.LABEL},
Relation.RAW_CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?",
new String[]{RAW_CONTACT_ID, Relation.CONTENT_ITEM_TYPE},
null);

if(cursor.moveToFirst())
{
do{
try {
final JSONObject jsonRelationshipObject = new JSONObject();

final String name = cursor.getString(0);
final Integer type = cursor.getInt(1);
final Integer id = cursor.getInt(2);
final String label = cursor.getString(3);

jsonRelationshipObject.put("id", id);
jsonRelationshipObject.put("type", type);
jsonRelationshipObject.put("label", label);
jsonRelationshipObject.put("name", name);

jsonArrayActual.put(jsonRelationshipObject);
} catch (JSONException e) {
e.printStackTrace();
fail("Failed while adding the values to the JSONObject. " + e.getMessage());
}
} while(cursor.moveToNext());
}
else
{
cursor.close();
fail("RawContact not found! ID: " + RAW_CONTACT_ID);
}

cursor.close();

try {
JSONAssert.assertEquals(jsonArrayExpected, jsonArrayActual, true);
} catch (JSONException e) {
e.printStackTrace();
cursor.close();
fail("JSONAssert exception: " + e.getMessage());
}

}

基本上,我正在调用我的真实方法,并且几乎重新编码我的(正在测试的)方法。我发现这毫无成效,或者至少相当无聊和乏味(再次编码我刚刚编码的内容)。我确信有更好的方法来执行 JUnit 测试。我想到自己查询联系人列表数据库并手动构建我的对象进行比较,如下所示:

public void testGetRelationship() {
JSONArray jsonArrayActual = new JSONArray();
JSONArray jsonArrayExpected = new JSONArray();

try {
jsonArrayExpected = contact.getRelationship(RAW_CONTACT_ID);
} catch (JSONException e) {
e.printStackTrace();
fail("Failed when calling the getRelationship method. " + e.getMessage());
}

jsonRelationshipObject.put("id", 6);
jsonRelationshipObject.put("type", 1);
jsonRelationshipObject.put("label", "A label");
jsonRelationshipObject.put("name", "the name");

jsonArrayActual.put(jsonRelationshipObject);

try {
JSONAssert.assertEquals(jsonArrayExpected, jsonArrayActual, true);
} catch (JSONException e) {
e.printStackTrace();
cursor.close();
fail("JSONAssert exception: " + e.getMessage());
}
}

编码速度更快,但缺点是我需要从手机手动下载数据库(对我来说没什么大不了的)并手动查询它以获取其中的数据(也没什么大不了的)但是它不是那么通用,如果数据库发生变化,我想所有测试都会失败。但我可以获取数据库的快照并将其保存,然后始终对该快照执行测试。

有什么建议吗?改进?

最佳答案

您应该看看 Mockito:https://code.google.com/p/mockito/

基本上,您必须模拟数据源/服务接口(interface)游标/内容解析器,并使用硬编码值(数据库快照的一些示例)来实现它。但只有当您必须维护查询机制时才应该这样做;如果这超出了您的项目范围和/或没有实际操作,这将没有帮助。

对于您的 testGetRelationship,这更多的是关于集成测试:您在管道的一侧注入(inject)一些数据,并期望在另一侧获得相同的数据。

在这种情况下,JUnit 可能不是正确的工具; JMeter 应该能更好地满足这些需求。以下是使用 JMeter 测试 JSON 数据的示例: Jmeter extracting fields/parsing JSON response

在 SDLC 中添加连接真实数据源的“集成测试”,但这些测试不应运行每个源构建/开发周期。您应该只在部署时运行“集成测试”来检查端到端集成。

关于java - JUnit 测试 - 进行测试的最佳且最可靠的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22683399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com