如何从Postgres测试随机排序的数据?

时间:2014-11-16 15:49:23

标签: ruby postgresql unit-testing random minitest

我正在编写一个REST API,它从Postgres数据库返回JSON中的产品。

我已经编写了集成测试来测试返回哪些产品,这样可以正常工作。刚刚引入了一项要求,即随机订购退回的产品。

我已将测试更改为不依赖于结果返回的顺序。我的问题是测试新的随机需求。

我计划使用Postgres'RANDOM()关键字在数据库中实现此功能。如果我在“代码中”执行此操作,我可以将随机代码生成器存根为始终相同的值,但我不确定在数据库中该怎么做。

如何测试我的新随机要求是否有效?

3 个答案:

答案 0 :(得分:1)

我找到了一种做我需要的方法。

您可以set the seed value for Postgres使用SETSEED()

如果在执行使用RANDOM()的查询之前设置种子,则每次都会以相同的顺序返回结果。

SELECT SETSEED(0.5);

SELECT id, title FROM products ORDER BY RANDOM() LIMIT 2;

SELECT查询后重置种子值。

为了测试数据随机返回,我们可以更改种子值。

我不想测试Postgres'RANDOM()是否有效,但是我的代码使用它。

答案 1 :(得分:0)

这将取决于您对随机性的定义。作为第一次尝试,您可以两次发出相同的请求,并确保返回相同的结果集,但顺序不同。这当然假设您的测试数据不会被页面或其他类似,但是如果它确实您的测试当然会更加困难,因为您可能必须检索所有页面以验证任何内容。

第二个想法是,分页可能会使整个请求变得复杂,因为它需要在几个页面中具有相同的随机性。

答案 2 :(得分:0)

恕我直言,如果你想测试随机性,你应该找到一个返回少量结果的查询 - 2将是理想的数字。

然后,您大量运行查询并计算不同排序可能性的出现次数。数字不能达到相同的值,但频率应收敛到1 / n,其中n是排序的数量。但实际上,您不需要随机生成器的质量,您只需要确保正确使用它。因此,您应该只测试您获得正确数量的测试的每种可能性之一。

如果n>如果n< = 10且n 2 ,我将使用100 run。 10.对于n = 10和100次运行,一次可能性关闭的概率小于3e-5。因此,运行一次测试,如果失败则再次运行,这应该足够了。当然,如果你想降低错误检测的风险,只需增加运行次数......但测试会更长......