2011-11-18 2 views
1

내가 좋아하는 방법을 다음데이터베이스 쿼리를 사용하여 데이터를 업데이트하는 방법을 테스트하려면 어떻게합니까?

public void ImportDataCommand() 
{ 
    // some data validation logic here 

    if (some_criteria_is_true) 
    { 
     // Call to a method which uses sql queries to update some records 
     UpdateRecords(); 
    } 
    else 
    { 
     // Call to a method which uses sql queries to delete some records 
     DeleteRecords(); 
    } 
} 
  • 을 어떻게 단위 테스트 방법 UpdateRecords()DeleteRecords() 수 있습니까? (가능한 경우)
  • 내가 가지고있는 현재 패턴은 냄새입니까?
  • 일부 데이터 유효성 검사 논리 및 일부 조건부 논리에 따라 달라지는 데이터 업데이트 논리가있을 때 더 나은 처리 방법이 있습니까?

이 점에 대해 도움을 주시면 감사하겠습니다. 더 많은 정보가 필요하거나 명확하지 않은 것이 있으면 알려주십시오.

업데이트 :

나는 여기에 데이터 소스를 조롱에 관심이 아니다. 내 SQL 쿼리가 정확하고 올바른 업데이 트를하고 있는지 확인하고 싶습니다. 혼란스러워서 미안하다면 데이터 유효성 검사 논리 (SQL)와 대조적으로 유효성 검사 논리를 테스트하고 싶습니다.

프레임 워크를 조롱 한 경험이 있으며 정상적인 응용 프로그램 논리에 대한 단위 테스트를 작성하는 데 성공적으로 사용했습니다.

+0

귀하의 방법은 아무 것도 반환하지 않습니다. 대개 단위 테스트를 통해 많은 매개 변수가 제공되고 반환 값이 예상과 일치하는지 테스트합니다. –

+0

@ 네빌 : 맞아. 예를 들어 데이터베이스에 데이터를 저장/업데이트하는 응용 프로그램 명령을 테스트하려고합니다. 그렇게 할 수있는 방법이 있습니까? NUnit을 사용하여 정상적인 응용 프로그램 로직에 대한 단위 테스트를 성공적으로 작성했습니다. –

+0

일반적인 방법은 조롱 프레임 워크를 사용하는 것입니다. 따라서 테스트를 특정 데이터베이스 아래에서 분리 할 수 ​​있습니다. –

답변

3

문제는 '및' '으로 시작됩니다.

동일한 클래스에서 유효성 검사 및 데이터 액세스가 필요하지 않습니다. 데이터 액세스를 다른 클래스에 위임하고 삽입하면 유효성 검사를 테스트 할 때 데이터 원본을 조롱 할 수 있습니다.

class Bar { 
private DataAccessService service 

public void Foo() 
{ 
    // some data validation logic here 

    if (some_criteria_is_true) 
    { 
     // Call to a method which uses sql queries to update some records 
     service.updateBarRecords(); 
    } 
    else 
    { 
     // Call to a method which uses sql queries to delete some records 
     service.deleteBarRecords(); 
    } 
} 

} 

그런 다음 조롱 프레임 워크를 사용하여 올바른 서비스 메소드가 호출되는지 테스트 할 수 있습니다.

+0

혼란을 가져 주어서 죄송합니다. 검증 로직이 아닌 데이터 업데이트 로직을 테스트하고 싶었습니다. 이 질문에 대한 업데이트를 참조하십시오. –

+0

Foo()가 테스트하려는 메서드가 아닌 경우 UpdateBarRecords()를 테스트하는 방법에 대해 질문해야합니다. – blank

+0

당신 말이 맞습니다. 나는 그것을 반영하기 위해 나의 질문을 업데이트했다. 감사. –

0

이것은 응용 프로그램의 전체 아키텍처와 회사의 IT/DB 인프라 및 중간 규모 또는 대기업의 DBA가 따라야하는 데이터 정책에 따라 다릅니다.

과거에는 단위 테스트를 위해 SQLite 인스턴스를 사용했거나 동일한 기술 (예 : SQL Server)을 사용할 수 있지만 개발 또는 QA 데이터베이스 서버에 연결하는 단위 테스트는 물론 생산되지 않았습니다.

내가 한 일은 명령 실행과 트랜잭션을 마지막 단계에서 단위 테스트에서 처리하는 것이 었습니다. 따라서 DEV/QA 데이터베이스에서는 아무 것도 유지되지 않지만 명령 실행은 테스트되었습니다 어쨌든 수행됩니다.

+0

일반적으로 DB 자체를 조롱하여 단위 테스트를 수행합니다. 프로덕션 DB에서 수행하는 것이 아니라 롤백 및 거치대를 처리해야합니다. 이전 프로젝트에서 보았던 것은 NUNIT 빌드를위한 전처리 지시문을 사용한 다음 SQL 실행을 다른 (주입) DB로 모두 리디렉션한다는 것입니다. 여기서 어디서 롤백을 할 필요가 없으며 무엇을 그렇게 할 필요가 없습니다. 모든 일이 끝나면 그냥 삭제하십시오. :) – Zenwalker

0

단위 테스트를 수행 할 때는 특히 그 단위에만 집중해야합니다. 따라서 테스트 케이스를 작성하면, 의존성 삽입 (API 호출 또는 어떤 경우)을 통해 일반적으로 호출하는 다른 메소드를 조롱한다. 다른 방법은 테스트 케이스를 추측하고 작성하는 방법입니다.

코드 케이스에서 Foo(), UpdateBarRecords() 및 DeleteBarRecords()에 대한 테스트 케이스를 별도로 작성한다고 가정합니다.

모든 메소드 호출 (유닛 테스트)을 무시하고 유닛 테스트에 집중하고있는 해당 메소드에서 작성한 핵심 로직 코드에 집중하십시오.

0

당신은 당신의 코드에서이 문제를 해결해야 IMHO :

  1. 푸 그것이 무엇이든 당신이 응용 프로그램 로직에 대한 데이터 액세스를 결합하고
  2. 을 반환하지 않기 때문에, 단위 testeable하지 않습니다 만드는 서로 다른 레이어도 함께 묶여 실제로 유닛 테스트
  3. 특정 조건에 따라 업데이트 및 삭제를 호출하는 방법은 아마도 두 가지 다른 동작을 갖는 것이 좋지 않을까요?

Foo의 이름은 자명하지 않으므로 그 밖의 것은별로 없지만 메서드의 컨텍스트를 자세히 설명 할 수 있다면 더 많은 설명을 추가 할 수 있습니다.

+2

무언가를 반환하지 않으면 확인하지 못한 것이 없다면 – blank

+0

@Bedwyr을 테스트 할 수 없습니다. 한 번 실행 된 메서드의 가시적 인 효과를 테스트 할 수 있지만 메서드 * 자체는 테스트 할 수 없습니다 . – mamoo

+0

메서드가 올바른 동작을하는지, 즉 무언가가 수행되어야하는 올바른 동작을 테스트 할 수 있습니다. 즉, 해당 상태가 클래스의 다른 곳에서 변경되었다고 선언하거나 메서드가 종속성에 대해 예상되는 메서드를 호출하는지 테스트 할 수 있습니다. – blank

관련 문제