문제

나는 생각하지 않는 이것은 특정 언어로 또는 프레임워크,그러나 내가 사용하는 xUnit.net C#.

나는이를 반환하는 함수 임의의 날짜에서 특정 범위에 있습니다.나는 전달에서 날짜,그리고 반환 날짜에 항상의 범위 1 에서 40 년 전에 주어진 날짜입니다.

지금 나는 그냥 있는지 궁금하는 좋은 방법의 단위에 이 테스트합니다.최선의 방법이 될 것으로 보인 반복을 창조하고자 함수 실행 즉100 시간 및 주장하는 모든 이들의 100 결과가에서 원하는 범위는 현재 접근 방식이다.

또한 것을 깨닫지 않는 한 나는 할 수 있어 임의의 발전기,없을 것이 완벽한 솔루션을(모든 후,그 결과 임의의),하지만 내가 궁금해 무엇을 접근할 때가 있을 테스트하는 기능을 반환하는 임의의 결과에서는 특정 범위는?

도움이 되었습니까?

해결책

함수가 원하는 범위에서 날짜를 반환하는 것을 테스트하는 것 외에도 결과가 잘 분산되어 있는지 확인하려고합니다. 당신이 설명하는 테스트는 당신이 보낸 날짜를 간단히 반환 한 함수를 전달합니다!

따라서 함수를 여러 번 호출하고 결과가 원하는 범위에 머무르는 것을 테스트하는 것 외에도 결과를 버킷에 넣고 버킷에 거의 같은 결과가 있는지 확인하여 분포를 평가하려고합니다. 완료. 안정적인 결과를 얻으려면 100 개 이상의 호출이 필요할 수 있지만 비용이 많이 드는 (런타임 현명한) 기능처럼 들리지 않으므로 몇 번의 K 반복을 위해 쉽게 실행할 수 있습니다.

나는 균일하지 않은 "무작위"기능에 문제가있었습니다. 그들은 진짜 고통이 될 수 있습니다. 일찍 테스트 할 가치가 있습니다.

다른 팁

임의의 숫자 생성기를 조롱하거나 가짜로 만들었습니다

이와 같은 일을하십시오 ... 나는 그것을 컴파일하지 않았으므로 몇 가지 구문 오류가있을 수 있습니다.

public interface IRandomGenerator
{
    double Generate(double max);
}

public class SomethingThatUsesRandom
{
    private readonly IRandomGenerator _generator;

    private class DefaultRandom : IRandomGenerator
    {
        public double Generate(double max)
        {
            return (new Random()).Next(max);
        }
    }

    public SomethingThatUsesRandom(IRandomGenerator generator)
    {
        _generator = generator;
    }

    public SomethingThatUsesRandom() : this(new DefaultRandom())
    {}

    public double MethodThatUsesRandom()
    {
        return _generator.Generate(40.0);
    }
}

시험에서, 단지 IrandomGenerator를 가짜 또는 조롱하여 통조림을 반환합니다.

테스트하는이 문제의 세 가지 측면이 있다고 생각합니다.

첫 번째 : 내 알고리즘이 올바른가요? 즉, 적절하게 기능하는 랜덤 수 생성기가 주어지면 범위에 무작위로 배포되는 날짜를 생성 할 것인가?

두 번째 : 알고리즘이 에지 케이스를 올바르게 처리합니까? 즉, 임의의 숫자 생성기가 가장 높거나 가장 낮은 허용 값을 생성 할 때, 어떤 것이 끊어 집니까?

세 번째 : 알고리즘 구현이 작동합니까? 즉, 알려진 의사 랜덤 입력 목록이 주어지면 예상되는 의사 랜덤 날짜 목록을 생성하고 있습니까?

처음 두 가지는 단위 테스트 스위트에 제작 한 것이 아닙니다. 그들은 시스템을 설계하는 동안 내가 증명할 수있는 것입니다. Daniel.Rikowski가 제안한 것처럼 Zillion 날짜를 생성하고 카이 제곱 테스트를 수행하는 테스트 하네스를 작성 하여이 작업을 수행 할 것입니다. 또한이 테스트 하네스가 두 가지 사례를 모두 처리 할 때까지 종료되지 않도록해야합니다 (임의의 숫자 범위가 작을 수있을 정도로 작다고 가정합니다). 그리고 나는 이것을 문서화하여 알고리즘을 개선하려고하는 사람이라면 누구나 그것이 깨진 변화라는 것을 알게 될 것입니다.

마지막 하나 ~이다 내가 단위 테스트를 만들었던 것. 이 알고리즘의 구현을 중단하는 코드에 대한 것이 없다는 것을 알아야합니다. 그런 일이 발생할 때 얻을 첫 번째 징후는 테스트가 실패한다는 것입니다. 그런 다음 코드로 돌아가서 다른 사람이 무언가를 고치고 있다고 생각하고 대신 파산했다고 알게 될 것입니다. 만약 누군가가 했다 알고리즘을 수정하십시오.이 테스트도 수정하기 위해 사용됩니다.

결과를 결정적으로 만들기 위해 시스템을 제어 할 필요가 없습니다. 당신은 올바른 접근 방식에 있습니다 : 함수의 출력에 대해 무엇이 중요한지 결정하고 그것을 테스트하십시오. 이 경우 결과는 40 일 범위에있는 것이 중요하며이를 테스트하는 것이 중요합니다. 항상 같은 결과를 반환하는 것은 아니므로 테스트하십시오. 더 멋진 사람이 되려면 결과가 일종의 임의성 테스트를 통과하는 것을 테스트 할 수 있습니다.

과 함께 사용을 정확하게 당신의 제안된 접근 방식:제어 임의의 생성기입니다.초기화 시험을 위한 기본 종자(또는 대체하여 그에게는 프록시 돌아 숫자에 맞는 내 testcases),그래서 결정/검사할 수 있는 행동을 했다.

무작위 숫자의 품질을 확인하려면 (독립성 측면에서)이를 수행하는 몇 가지 방법이 있습니다. 좋은 방법은 카이 스퀘어 테스트.

기능이 무작위 날짜를 만드는 방법에 따라 불가능한 날짜 : 불가능한 도약 또는 30 일의 31 일째를 확인할 수도 있습니다.

전시하지 않는 방법 a 결정 론적 행동 결과는 하나의 실행과 다른 실행과 다르므로 올바르게 단위 테스트 할 수 없습니다. 이것을 돌아 다니는 한 가지 방법은 다음과 같습니다 씨앗 단위 테스트에 고정 된 값을 가진 난수 생성기. 날짜 생성 클래스의 무작위성을 추출 할 수도 있습니다 (따라서 단일 책임 원칙), 단위 테스트에 대해 알려진 값을 주입합니다.

물론, 고정 된 시드 임의 숫자 생성기를 사용하면 잘 작동하지만 예측할 수없는 것을 테스트하려고합니다. 괜찮습니다. 고정 테스트가 많이있는 것과 같습니다. 그러나 중요한 것을 테스트하지만 모든 것을 테스트하려고 시도하지 마십시오. 나는 임의의 테스트가 모든 것을 테스트하는 방법이라고 생각하며 효율적이지 않거나 빠르지 않습니다. 버그를 치기 전에 많은 무작위 테스트를 실행해야 할 수 있습니다.

내가 여기에 가려고하는 것은 시스템에서 찾은 각 버그에 대한 테스트를 간단히 작성해야한다는 것입니다. 극한의 조건에서도 기능이 실행되고 있는지 확인하기 위해 가장자리 케이스를 테스트하지만 실제로는 너무 많은 시간을 소비하거나 단위 테스트를 느리게 실행하거나 프로세서주기를 낭비하지 않고 할 수있는 최선입니다.

임의의 기능을 재정의하는 것이 좋습니다. PHP에서 단위 테스트를 거치기 때문에이 코드를 작성합니다.

// If we are unit testing, then...
if (defined('UNIT_TESTING') && UNIT_TESTING)
{
   // ...make our my_rand() function deterministic to aid testing.
   function my_rand($min, $max)
   {
      return $GLOBALS['random_table'][$min][$max];
   }
}
else
{
   // ...else make our my_rand() function truly random.
   function my_rand($min = 0, $max = PHP_INT_MAX)
   {
      if ($max === PHP_INT_MAX)
      {
         $max = getrandmax();
      }
      return rand($min, $max);
   }
}

그런 다음 테스트 당 필요로 Random_table을 설정했습니다.

임의의 함수의 실제 무작위성을 테스트하는 것은 별도의 테스트입니다. 단위 테스트에서 무작위성을 테스트하는 것을 피하고 대신 사용중인 프로그래밍 언어에서 별도의 테스트와 Google에 무작위 기능의 실제 무작위성을 수행합니다. 비 결정적 테스트 (전혀없는 경우)는 단위 테스트에서 제외되어야합니다. 어쩌면 이러한 테스트를위한 별도의 스위트 룸이있을 수 있습니다.이 테스트는 실제로 패스 인 실패의 기회를 최소화하기 위해 사람의 입력 또는 훨씬 더 긴 달리기 시간이 필요합니다.

나는 단위 테스트가 이것을위한 것이라고 생각하지 않습니다. 확률 값을 반환하는 함수에 대해 단위 테스트를 사용할 수 있지만 고정 된 시드를 사용할 수 있습니다.이 경우 확률 론적이 아닌 방식으로 말하자면 무작위 시드에 대해서는 단위 테스트가 원하는 것이라고 생각하지 않습니다. RNG의 경우, 당신이 의미하는 것은 시스템 테스트입니다. 시스템 테스트는 RNG를 여러 번 실행하고 분포 또는 순간을 살펴 봅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top