문제

2 XML 파일을 처리하고 텍스트 파일을 생성하는 클래스가 있습니다.

다음을 수행하는이 클래스의 개별적으로 통과하거나 실패 할 수있는 많은 단위 / 통합 테스트를 작성하고 싶습니다.

  1. 입력 A 및 B의 경우 출력을 생성하십시오.
  2. 생성 된 파일의 내용을 예상 된 출력과 비교
  3. 실제 내용이 예상 내용과 다른 경우 실패하고 일부를 표시합니다. 유용한 차이점에 대한 정보.

아래는 단위 테스트에서의 첫 찌르기와 함께 클래스의 프로토 타입입니다.

이런 종류의 테스트에 사용해야하는 패턴이 있습니까? 아니면 사람들이 Zillions of TestX () 기능을 작성하는 경향이 있습니까?

Nunit과의 텍스트 파일 차이를 동원하는 더 좋은 방법이 있습니까? TextFile Diff 알고리즘을 포함시켜야합니까?


class ReportGenerator
{
    string Generate(string inputPathA, string inputPathB)
    {
        //do stuff
    }
}

[TextFixture]
public class ReportGeneratorTests
{
     static Diff(string pathToExpectedResult, string pathToActualResult)
     {
         using (StreamReader rs1 = File.OpenText(pathToExpectedResult))
         {
             using (StreamReader rs2 = File.OpenText(pathToActualResult))
             {
                 string actualContents = rs2.ReadToEnd();
                 string expectedContents = rs1.ReadToEnd();                  

                 //this works, but the output could be a LOT more useful.
                 Assert.AreEqual(expectedContents, actualContents);
             }
         }
     }

     static TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
     {
          ReportGenerator obj = new ReportGenerator();
          string pathToResult = obj.Generate(pathToInputA, pathToInputB);
          Diff(pathToExpectedResult, pathToResult);
     }

     [Test]
     public void TestX()
     {
          TestGenerate("x1.xml", "x2.xml", "x-expected.txt");
     }

     [Test]
     public void TestY()
     {
          TestGenerate("y1.xml", "y2.xml", "y-expected.txt");
     }

     //etc...
}

업데이트

DIFF 기능을 테스트하는 데 관심이 없습니다. 더 읽기 쉬운 실패를 생성하는 데 사용하고 싶습니다.

도움이 되었습니까?

해결책

데이터가 다른 여러 테스트의 경우 Nunit RowTest 확장자를 사용하십시오.

using NUnit.Framework.Extensions;

[RowTest]
[Row("x1.xml", "x2.xml", "x-expected.xml")]
[Row("y1.xml", "y2.xml", "y-expected.xml")]
public void TestGenerate(string pathToInputA, string pathToInputB, string pathToExpectedResult)
 {
      ReportGenerator obj = new ReportGenerator();
      string pathToResult = obj.Generate(pathToInputA, pathToInputB);
      Diff(pathToExpectedResult, pathToResult);
 }

다른 팁

아마도 "금"데이터에 대한 테스트를 요청하고있을 것입니다. 전 세계적으로 받아 들여진 이런 종류의 테스트에 대한 특정 용어가 있는지는 모르겠지만 이것이 우리가하는 방식입니다.

기본 고정물 클래스를 만듭니다. 기본적으로 "void dotest (string filename)"가 있는데,이 파일은 메모리에 특정 파일을 읽고, 추상 변환 메소드 "Stranct (String Text)"를 실행 한 다음 같은 위치에서 filename.gold를 읽고 예상대로 변환 된 텍스트를 비교합니다. . 내용이 다르면 예외가 발생합니다. 예외는 첫 번째 차이의 줄 번호와 예상 및 실제 라인의 텍스트를 포함합니다. 텍스트가 안정적이므로 일반적으로 문제를 바로 발견하기에 충분한 정보입니다. "예상 :"및 "실제 :"로 선을 표시하십시오. 그렇지 않으면 테스트 결과를 볼 때 영원히 추측 할 것입니다.

그런 다음 올바른 작업을 수행하는 변환 방법을 구현 한 다음 다음과 같은 테스트가있는 특정 테스트 비품이 있습니다.

[Test] public void TestX() { DoTest("X"); }
[Test] public void TestY() { DoTest("Y"); }

실패한 테스트의 이름은 깨진 내용을 즉시 알려줍니다. 물론 행 테스트를 사용하여 유사한 테스트를 그룹화 할 수 있습니다. 별도의 테스트를 받으면 시험을 무시하고 테스트를 동료에게 전달하는 등 여러 상황에서도 도움이됩니다. 스 니펫을 만드는 것은 큰 문제가되지 않습니다. 스 니펫이 잠시 후에 테스트를 만들 수있는 스 니펫을 만드는 것은 큰 일이 아닙니다. 데이터를 준비하는 데 훨씬 더 많은 시간을 소비 할 것입니다.

그런 다음 일부 테스트 데이터와 기본 비품이 찾을 수있는 방법이 필요합니다. 프로젝트에 대한 규칙을 설정해야합니다. 테스트가 실패하면 실제 출력을 금 근처 파일에 버리고 테스트 패스 인 경우 지우십시오. 이렇게하면 필요할 때 Diff 도구를 사용할 수 있습니다. 금 데이터가 발견되지 않으면 적절한 메시지로 테스트가 실패하지만 실제 출력은 어쨌든 작성되어 올바른지 확인하여 "금"이되도록 복사 할 수 있습니다.

아마도 루프가 포함 된 단일 단위 테스트를 작성할 것입니다. 루프 내부에서는 2 개의 XML 파일과 diff 파일을 읽은 다음 XML 파일을 디스크에 쓰지 않고 DIFF 파일과 비교합니다. 파일은 번호가 매겨 질 것입니다 (예 : a1.xml, b1.xml, diff1.txt; A2.xml, B2.xml, diff2.txt; A3.xml, B3.xml, diff3.txt 등은 다음 숫자를 찾지 못하면 루프가 중지됩니다.

그런 다음 새 텍스트 파일을 추가하면 새로운 테스트를 작성할 수 있습니다.

areequal을 호출하는 대신 두 입력 스트림을 직접 구문 분석하고 선과 열을 유지하고 내용을 비교할 수 있습니다. 차이를 찾 자마자 ...와 같은 메시지를 생성 할 수 있습니다.

32 행 12 열 - 'y'가 예상 될 때 'X'를 찾았습니다.

여러 줄의 출력을 표시하여 선택적으로 향상시킬 수 있습니다.

라인 32 열 12의 차이, 첫 번째 차이
a = 이것은엑스
b = 이것은 있습니다이자형STS

원칙적으로, 나는 일반적으로 내 코드를 통해서만 두 개의 스트림 중 하나만 생성합니다. 다른 하나는 테스트/텍스트 파일에서 가져 왔습니다.

아마 XMLReader를 사용하여 파일을 반복하여 비교할 것입니다. 차이를 누르면 파일이 다른 위치에 xpath를 표시합니다.

추신 : 그러나 실제로는 전체 파일을 문자열로 간단하게 읽고 두 문자열을 비교하는 것이 충분했습니다. 보고의 경우 테스트가 실패했음을 알기에 충분합니다. 그런 다음 디버깅을 할 때 일반적으로 사용 파일이 다릅니다. Araxis 합병 정확히 어디에 문제가 있는지 확인하기 위해.

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