我正在编写一个REST API,它从Postgres数据库返回JSON中的产品。
我已经编写了集成测试来测试返回哪些产品,这样可以正常工作。刚刚引入了一项要求,即随机订购退回的产品。
我已将测试更改为不依赖于结果返回的顺序。我的问题是测试新的随机需求。
我计划使用Postgres'RANDOM()
关键字在数据库中实现此功能。如果我在“代码中”执行此操作,我可以将随机代码生成器存根为始终相同的值,但我不确定在数据库中该怎么做。
如何测试我的新随机要求是否有效?
答案 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。因此,运行一次测试,如果失败则再次运行,这应该足够了。当然,如果你想降低错误检测的风险,只需增加运行次数......但测试会更长......