2014-11-16 2 views
1

Postgres 데이터베이스에서 JSON으로 제품을 반환하는 REST API를 작성하고 있습니다.Postgres에서 임의로 정렬 된 데이터를 테스트하려면 어떻게해야합니까?

반환되는 제품을 테스트하기 위해 통합 테스트를 작성했으며 정상적으로 작동합니다. 반환 된 제품을 무작위로 주문하려면 요구 사항이 도입되었습니다.

결과가 다시 나오는 순서에 의존하지 않기 위해 테스트를 변경했습니다. 내 문제는 새로운 임의적 요구 사항을 테스트하는 것입니다.

Postgres의 RANDOM() 키워드를 사용하여 데이터베이스에 구현할 계획입니다. 내가 "코드에서"이것을 수행했다면 나는 임의의 코드 생성기를 항상 같은 값으로 스터핑 할 수 있었지만 데이터베이스에서 무엇을해야할지 모르겠습니다.

새로운 무작위 요구 사항이 작동하는지 어떻게 테스트 할 수 있습니까?

+0

암호로 보호되는 임의성이 있어야합니까? – jjanes

+1

아니요, 그렇지 않습니다 :) – jordelver

답변

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()이 작동하는지 테스트하고 싶지 않지만 그것을 사용하는 코드는 테스트하고 싶지 않습니다.

0

임의성의 정의에 따라 달라집니다. 첫 번째 시도로서 동일한 요청을 두 번 발행하고 동일한 결과 세트가 다른 순서로 리턴되는지 확인할 수 있습니다. 이것은 물론 테스트 데이터가 페이지에 포함되지 않을 것이라고 가정합니다. 그러나 테스트를 수행하면 테스트를 더 어렵게 만들 것입니다. 아마 아무것도 확인하기 위해 모든 페이지를 검색해야 할 것입니다.

두 번째 생각에서 페이징은 여러 페이지에 걸쳐 이 동일한의 임의성을 요구하므로 전체 요청을 복잡하게 만듭니다.

+0

답변 해 주셔서 감사합니다. 나는 이것도 작동하지 않습니다. 두 가지 요청을하면 결과가 다른 주문으로 되돌아 올 것이라고 보장 할 수 없습니다. 그들은 같은 순서로 두 번 다시 올 수 있습니다. – jordelver

0

IMHO 임의성을 테스트하려면 몇 가지 결과를 반환하는 쿼리를 찾아야합니다. 2가 이상적인 숫자가됩니다.

그런 다음 쿼리를 여러 번 실행하고 서로 다른 순서의 가능성을 계산합니다. 수는 같은 값에 도달해서는 안되지만 주파수는 1/n으로 수렴되어야합니다. 여기서 n은 순서의 수입니다. 그러나 실제로 무작위 생성기의 품질을 원하지는 않습니다. 필요한 것은 올바르게 사용하는 것입니다. 따라서 올바른 수의 테스트를 위해 각 가능성 중 하나를 얻는 지 테스트해야합니다.

만약 n> 10이라면 n < = 10이고 n은 이면 100을 사용할 것입니다. n = 10과 100의 실행에 대해 하나의 가능성을 갖는 확률은 3e-5 미만입니다. 따라서 테스트를 한 번 실행하고 실패하면 다시 실행하십시오. 물론 잘못된 검색의 위험을 줄이려면 실행 횟수를 늘리십시오. 그러나 테스트는 더 오래 걸릴 것입니다 ...

+0

이것은 매우 복잡하게 들립니다. 나는 그 시험이 그만한 가치가 있는지 확신하지 못한다. – jordelver

+0

@jordelver : 데이터를 주문하는 것이 쉽지 않다는 것을 증명하기가 쉽습니다 ... –

+0

예, 따라서 제 질문에 답하십시오. :) – jordelver