- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个案例对我来说似乎是同一个问题,尽管它们是完全不同的情况:
1) 我正在测试对象对数据库的读写。因为我每次都在清理和重建对象,写入测试需要读取以确认每个字段的写入,而读取测试是先写入,所以测试最终看起来是一样的。然而,我不想让接口(interface)中的主要方法未经测试。
2) 在更小的情况下,我正在为一个小数据对象测试一个 copy() 方法和一个 equals() 方法。 copy() 方法使用 equals() 来测试自身,而 equals() 方法正在针对副本进行测试。同样,测试是重复的。
我觉得我在这里遗漏了一些东西,一些方法来分离依赖而不创建大量额外的工作(比如让原始 JDBC 写入数据库等)有没有一种标准的方法来处理这种情况重复测试?
1 Câu trả lời
对我来说,这种测试是一种代码味道。问题始终是:此测试究竟测试了什么?对于这个测试,您信任什么,不信任什么?
对我来说,你不能同时信任 read() 和 write(),它们可能在同一个类中,由同一个人编写。因此,如果您通过调用 write() 来测试 read(),那么这不是一个好的测试,您测试的是 write() 和 read() 是否同步,而不是它们做了它们应该做的事情。
在第二个示例中,您正在测试复制和等价是否同步,同样的问题。
假设这是持久层的实现:
public class PersistenceLayer {
private Object object;
void write(Object object) {
this.object = object;
}
Object read(Long id) {
return object;
}
}
问题是,你的测试会通过这个持久层吗?但它显然不会做你想要的。它不靠近数据库。同样,如果您的读写共享 session /事务,您的测试会通过吗?在这种情况下,数据可能永远不会真正提交给数据库。它可能会在最后进行回滚。但是您的测试仍然会通过。
阅读您的描述,您正在测试当我调用 write() 然后调用 read() 时,我得到一个类似的对象。我对 write() 方法的期望是它将数据写入数据库。所以如果我正在测试那个,我需要检查那个。所以我必须有另一个 channel 可以用来测试读写。这通常以通过 JDBC 创建新连接并进行选择结束。
所以我的测试代码是
testWrite() {
write(o);
Object o2 = readByJdbc("SELECT * FROM table WHERE id = ?", o);
assertObjectsEqual(o, o2); // this needs to compare all values
}
testRead() {
write(o);
Object o2 = read(o.id);
Object o3 = readByJdbc("SELECT * FROM table WHERE id = ?", o);
assertObjectsEqual(o2, o3); // this needs to compare all values
}
testWrite() 写入数据库并确保数据通过打开 JDBC 连接并以这种方式读取(不同的 session ,不同的事务,即数据将在数据库中)写入数据库。
testRead() 写入数据库并比较通过持久层和通过jdbc 读取返回的两个对象。我正在复制对 write(o) 的调用,但它是可以接受的,因为我们知道当另一个测试被调用时 write 是否会起作用。我可以再写一个 writeByJdbc,但我得到的只是一个测试会失败,而不是两个。
事实上,根据您的偏执程度,您不需要比较 assertObjectsEqual() 中的所有值。例如,如果您使用的是 hibernate,您可以假设所有内容都已正确声明,并测试数据库中是否存在该行。我经常这样做,因为我相信 hibernate 。但在那种情况下,我需要测试我如何调用 hibernate ,如何定义对象。
jdbc 代码不需要很长很复杂,对于一个简单的选择,我只是创建一个列到值的映射列表:
private List<>> resultSetToListMap(ResultSet resultSet) throws SQLException {
int columnCount = resultSet.getMetaData().getColumnCount();
List<>> list = new ArrayList<>>();
while (resultSet.next()) {
Map map = new LinkedHashMap();
for (int i = 1; i <= columnCount; i++) {
map.put(resultSet.getMetaData().getColumnName(i), resultSet.getObject(i));
}
list.add(map);
}
return list;
}
这对于大多数测试来说已经足够了。
关于java - 解决 JUnit 中的重复测试习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988107/
本着this question from JUnit 3 to JUnit 4的精神, 是否有任何正则表达式列表到 有效地从 junit 4 API 迁移到 junit 5 API ,不管代码大小?
Hiện tại, câu hỏi này không phù hợp với định dạng Hỏi & Đáp của chúng tôi. Chúng tôi mong đợi câu trả lời được hỗ trợ bởi các sự kiện, tài liệu tham khảo hoặc chuyên môn, nhưng câu hỏi này có thể gây ra tranh luận, tranh cãi, thăm dò ý kiến hoặc thảo luận mở rộng. Nếu bạn cảm thấy câu hỏi này có thể được cải thiện và có thể mở lại, hãy truy cập
我需要以下测试 @runwith(cache, memory) class CollectionA is -- this is a suite (aka folder) class Cache {
当尝试在JUNITTEST的内存数据库中使用derby时,出现以下异常。 java.sql.SQLNonTransientConnectionException: Database 'memory:t
我需要以下测试 @runwith(cache, memory) class CollectionA is -- this is a suite (aka folder) class Cache {
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to run Junit testcases from command line? 如何在 Linu
可以将 Junitperf 与 junit4 一起使用吗?我有一个带有多个测试的简单 Junit4 测试类,我想对该类的单个测试进行 TimedTest。我该怎么做? 更清楚地说,我的 Junit4
我想将 JUnit 4 测试添加到使用 JUnit 3 测试套件(“AllTests”)来组织测试的遗留项目中。 测试已经用 JUnit 4 执行了,所以我知道 JUnit 4 测试在原则上是有效的。
我正在将我的代码库从 junit4 迁移到 junit5。我在我的测试用例中使用了 mockito。下面是我用于依赖项的不同版本。 5.2.0 1.2.0 1.10.19 or
我刚刚使用 qunit-reporter-junit 生成了以下 XML: 但是当我运行它时,我在以下位置找到了 xsd:http
我已经编写了一个自定义 JUnit 运行器,我希望它成为 eclipse 插件的一部分,该插件将使用该运行器启动测试,而无需将 @RunWith 注释应用于该类。我已经设法使用 org.eclipse
我发现我的Sonar实例5.1或5.1.1(带有最新的声纳运行器2.x)停止在项目的仪表板上显示部分单元测试信息(单元测试小部件)。 我拥有的属性是(在Gradle的sonarRunner> sona
我有一个 JUnit 测试。但是当我使用“Run as -> JUnit”时它会成功,而当我使用“Cover as -> JUnit”时它会失败。这是为什么?代码确实有问题。在代码中,我使用了一些遗留
这个问题在这里已经有了答案: How to test code dependent on environment variables using JUnit? (20 个答案) 关闭 8 年前。 我
当我们的临时服务器因每周维护而停机时,我们有许多集成测试失败。当临时服务器关闭时,我们会发送一个特定的响应,我可以在集成测试中检测到该响应。当我得到这个响应而不是测试失败时,我想知道是否可以跳过/忽略
我需要测试一个程序,它首先预处理一些数据,然后使用这些预处理过的数据计算几个不同的结果——为每个计算编写单独的测试是有意义的。 官方 JUnit 政策似乎是我应该在每次计算测试之前运行预处理。 我如何
JUnit 是否可以为每个测试方法添加描述文本,以便描述文本稍后出现在surefire/failsave xml 报告中!? 背景:我在受监管的环境中工作,必须编写大量文档、测试规范和测试报告。 JU
当 JUnit 中的断言失败时,我想做一些“自己的事情”。我想要这个: public class MyAssert extends org.junit.Assert { // @Overrid
đóng cửa. Câu hỏi này không liên quan đến chủ đề. Hiện tại không chấp nhận câu trả lời. Bạn muốn cải thiện vấn đề này? Cập nhật câu hỏi để phù hợp với chủ đề trên Stack Overflow. Đã đóng cửa 8 năm trước. Cải thiện q này
我想将参数从运行配置传递给我的 JUnit 测试。我如何到达 JUnits 的主要方法来访问这些参数?有谁知道如何做到这一点? 谢谢 最佳答案 您可以使用 -D 系统属性运行单元测试,并使用 Syst
Tôi là một lập trình viên xuất sắc, rất giỏi!