2010-07-20 3 views
1

최근에 NUnit을 사용하여 Rhino Mock을 시작했습니다. 이제 C# 프로젝트에서 사용할 준비가되었습니다.C#과 NUnit 단위 테스팅 라이브러리

프로젝트에는 필자가 작성해야하는 데이터베이스 라이브러리가 포함되어 있습니다.

나는이 테스트가 독립적이어야하며 서로 또는 테스트 실행 순서에 의존하지 말아야한다는 것을 읽었습니다.

그래서 FTP 또는 데이터베이스 연결을 확인하려고한다고 가정합니다. 내가 행을 삽입과 같은 일부 데이터베이스 기능을 테스트 포함 할 수

[Test] 
public void OpenDatabaseConnection_ValidConnection_ReturnsTrue() 
{ 
    SomeDataBase db = new SomeDataBaseLibrary(...); 
    bool connectionOk = db.Open(); 
    Assert.IsTrue(connectionOk); 
} 

또 다른 시험처럼 작성할 수 있습니다.

[Test] 
public void InsertData_ValidData_NoExceptions() 
{ 
     SomeDataBase db = new SomeDataBaseLibrary(...); 
     db.Open(); 

     db.InsertSomeRow("valid data", ...); 
} 

나는이 몇 가지 문제를 참조하십시오

1) 문제는 마지막 시험, 첫 번째 테스트에 독립하기 위해, 다시 데이터베이스 연결을 열어야 할 것입니다. (연결을 열기 전에 다시 연결을 닫는 첫 번째 테스트가 필요합니다.) 2) 또 다른 한 가지는 SomeDataBaseLibrary가 변경되면 모든 테스트 메소드도 변경되어야한다는 것입니다.

3) 테스트가 실행될 때마다 이러한 모든 연결이 설정되어야 테스트 속도가 저하됩니다.

일반적으로 어떻게 처리합니까?

나는 DataBaseLibrary의 mock을 사용할 수 있다는 것을 알고 있지만, 프로젝트에서 내 첫 번째 목표 인 라이브러리 자체를 테스트하지는 않습니다.

+1

이들은 단위 테스트가 아니라 통합 테스트입니다. 그것들은 테스트중인 장치 외부의 소프트웨어 및 구성에 의존합니다. –

+0

그래서 그들은 대신 조롱 받아야합니까? – lejon

+0

데이터 액세스 레이어를 테스트하기 위해 데이터베이스를 조롱하는 좋은 방법이 있다면 찾아보십시오. 네가 그렇게하지 않으면 나는 그것에 대해 걱정하지 않을 것이다. 실제 데이터베이스로 테스트 할 때 심각한 단점이 있지만 대처할 수 있습니다. IMO를 사용하면 실제 데이터베이스와의 통합 테스트를 작성하는 것이 데이터베이스를 조롱하여 실제 단위 테스트를 작성하는 것보다 쉽기 때문에 먼저 더 쉬운 기술부터 시작하겠습니다. – apollodude217

답변

1

1 : 모든 테스트 전에 연결을 열어서 해당 연결을 사용하는 모든 테스트가 끝날 때까지 열어 둘 수 있습니다. 방법에 대한 특정 속성이 많이 [테스트] 속성처럼, 그 메소드를 호출 할시기를 지정,이 있습니다

http://www.nunit.org/index.php?p=attributes&r=2.2.10

을 살펴 보자

TestFixtureSetUpAttribute (2.1 NUnit과를) 이를 속성은 TestFixture 내부에서 사용되어 조명기의 테스트를 실행하기 전에 한 번 수행되는 단일 기능 세트를 제공합니다. TestFixture는 하나의 TestFixtureSetUp 메소드 만 가질 수 있습니다. 둘 이상이 정의되면 TestFixture는 성공적으로 컴파일되지만 테스트는 실행되지 않습니다.

따라서이 속성으로 정의 된 메서드 내에서 데이터베이스 연결을 열고 데이터베이스 환경을 테스트 환경 전역으로 만들 수 있습니다. 그런 다음 모든 단일 테스트에서 해당 데이터베이스 연결을 사용할 수 있습니다. 동일한 연결을 사용하더라도 테스트는 여전히 독립적입니다.

나는 이것이 또한 당신의 세번째 관심사를 해결한다고 믿습니다.

SomeDataBaseLibrary 클래스에서 발생하는 변경 사항의 범위를 알지 못하기 때문에 두 번째 우려 사항에 어떻게 대답 할 지 잘 모르겠습니다.

0

이러한 테스트는 단위 테스트가 아닌 통합 테스트입니다. 하지만 지금 당장은 중요하지 않습니다.

  1. @sbenderli는 TestFixtureSetUp을 사용하여 연결을 시작하고 DB 연결 조건을 나타내는 거의 빈 테스트를 작성할 수 있습니다. 여러 테스트에서 테스트 데이터베이스에 연결해야하기 때문에 1 버그 -> 1 테스트의 이상을 포기해야한다고 생각합니다. 데이터 액세스 레이어를 사용하는 경우 부작용 (예 : 캐싱)이있는 경우 여기 interacting tests (<- 링크가 손상되었을 수 있음)에 대해주의해야합니다.
  2. 좋습니다. 테스트는 SUT (이 경우에는 SomeDataBaseLibrary)를 사용하는 방법을 보여줍니다. SUT 로의 변경이 그것이 사용 된 방법으로 바뀌어야한다면, 알고 싶을 것입니다. 이상 적으로 클라이언트 코드를 손상시킬 SomeDataBaseLibrary를 변경하면 자동 테스트가 중단됩니다. 자동화 된 테스트를하든하지 않든간에 SUT에 따라 아무 것도 변경하지 않아도됩니다. 자동화 된 테스트는 변경해야 할 추가 사항 중 하나이지만, 변경 사항을 적용해야한다는 사실을 알려줍니다.
  3. 이 TestFixtureSetUp으로 처리되었습니다.

이미 처리해 두었던 한 가지 : InsertData_ValidData_NoExceptions는 자체 테스트 이후 상호 작용 테스트로 이어지지 않습니다. 필자가 직접 테스트를 수행 한 가장 쉬운 방법은 TransactionScope을 사용하는 것입니다. SetUp 클래스에 하나 만들고 TearDown에 배출하십시오. 내 경험에 부합되는 데이터베이스 (호환 데이터베이스 포함)처럼 작동합니다. 당신이 TestFixtureSetup에 연결 로직이 있으면, 당신은 여전히이 같은 연결을 테스트 할 수 있습니다 :

편집

은 다음과
[Test]  
public void Test_Connection() 
{ 
    Assert.IsTrue(connectionOk); 
} 

하나의 단점은 시험의 연습 단계는 암시 적이다 - 그것은 부분이다 설정 논리. IMHO, 괜찮아.

+0

데이터베이스 연결 부분을 설정으로 이동하면 단위 테스트가 필요합니다. 맞습니까? TestFixtureSetUp 속성을 사용할 때 연결 자체를 테스트하는 기능이 희생됩니까? (TestFixtureSetUp은 Test가 아니기 때문에) – lejon

+0

아니요, 앱 외부에 시스템 (이 경우 실제 데이터베이스)이 필요하기 때문에 통합 테스트가 계속됩니다. 이것은 전혀 나쁜 것이 아닙니다. 용어의 문제 일뿐입니다 (단위 테스트 대 통합 테스트). – apollodude217

+0

연결 자체를 테스트하는 방법은 편집을 참조하십시오. 아, 또한이 테스트가 특히 가치가있는 것은 아닙니다 (연결 이외의 테스트를하는 다른 테스트와 비교). – apollodude217

관련 문제