【问题标题】:H2 does not detect group by issue on Junit TestH2 在 Junit 测试中未按问题检测分组
【发布时间】:2018-07-12 02:47:36
【问题描述】:

我做了一个java项目,第一次用H2来测试我的程序。 我正在使用 H2 运行我的 Junit 和黄瓜测试。

我有一个从几个表中获取数据的查询。

SELECT film.TITLE, film.DIRECTOR, cinema.LOCATION, cinema.THEATER_NAME, SUM(income.NUMBER_VIEW) 
FROM DRFGIRF7B_OPE.MOVIE as film
INNER JOIN DRFGIRF7B_OPE.MOVIE_THEATER as income ON film.FILM_ID = income.FILM_ID 
INNER JOIN DRFGIRF7B_OPE.THEATER as cinema ON income.THEATER_ID = cinema.THEATER_ID 
WHERE film.COUNTRY_COD = 'FRA'
GROUP BY film.TITLE, film.DIRECTOR, cinema.LOCATION;

这里,GROUP BY 语句中缺少“cinema.THEATER_NAME”。 当我在 SQL IDE 中执行此查询时,出现此错误消息(这是预期的):

SQL Failed : Selected non-aggregate values must be part of the assiociated group

但是当我使用 Junit 运行测试时,H2 没有检测到这个问题,并且我的所有测试都通过了,而查询被调用了。

你有什么想法,为什么我的测试没有失败?

【问题讨论】:

  • 请阅读meta.stackoverflow.com/questions/285551/… 和接受的答案
  • 另一个很好的例子说明为什么使用与生产环境不同的 DBMS 进行测试没有意义
  • 旅程的第一部分,我并不知道。我正在查看所有功能 有粗体选项,斜体选项。不,我在写这篇文章时没有找到给我的代码着色的方法(这是我的第一篇文章,我现在就知道了)谢谢你关于图片的帖子,我无法以不同的方式或可能但不知道怎么弄

标签: java sql junit group-by h2


【解决方案1】:

您使用的数据库可能对这些查询的限制更大。

如果您想在测试中更接近现实,请尝试像这样配置您的 H2 连接:

http://www.h2database.com/html/tutorial.html#using_hibernate

【讨论】:

  • 谢谢你的回答,我没有使用Hibernate,而且H2网站提供的补丁被我公司代理屏蔽了。我认为你对H2的限制是正确的,但我是无法用这个补丁更正它,我错过了什么?
【解决方案2】:

不同的数据库供应商做事不同。例如,MySQL and SQLite 决定违反规范和大多数其他数据库,并在使用 group by 时允许 select 中的任何列(将使用其中一个值)。

H2 没有记录它违反标准并基于error message

当在表达式列表或 group 或聚合查询的 order by 子句中使用列,并且该列不在 GROUP BY 子句中时,将引发代码 90016 的错误。

您的查询不应该被允许并且您的测试应该失败。

然而实际发生的是,当查询只返回一个不在group byH2 中的列的值时:

create table test(a int, b int);

insert into test values(1,1);
insert into test values(1,1);

select a,b from test group by a; -- output 1,1

当有多个值时,它会失败。

insert into test values(1,1);
insert into test values(1,2);

select a,b from test group by a; -- Error: Column "B" must be in the GROUP BY list

这看起来像一个错误,应该报告(如果没有其他人愿意,我可能会在不久的将来自己做)。

您遇到的问题很好地说明了为什么使用不同的数据库进行测试和生产是一个糟糕的主意。

【讨论】:

  • 感谢您的精彩回答。
  • 感谢您的精彩回答。不幸的是,我们的 Jenkins 确实可以访问数据库 (Teradata)。所以我们决定使用嵌入式数据库(H2)来运行我们的测试。我们目前知道在测试和生产中使用不同的数据库并不是最佳实践。如果你是我们的情况,你会怎么做?也许你可以给我们一些建议来改变我们的测试方式。我们的产品数据库是 Teradata,我们需要至少 80% 的覆盖率才能投入生产。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2011-03-02
  • 1970-01-01
  • 2015-11-20
  • 2020-04-17
相关资源
最近更新 更多