문제

난 근처의 새로운 프로젝트(말하다!) 처음으로 하려고 해요 단위 테스트를 포함 프로젝트에서입니다.

문제가 생겼을 고안 일부 단위의 테스트 자체입니다.나는 몇 가지 방법이는 쉽게 충분 테스트(패스에서 두 개의 값을 확인하는 예상된 출력).나의 코드의 다른 부분을 수행하는 더 복잡한 실행과 같은 것들에 대한 쿼리 데이터베이스에 그리고 나는 확실하지 않는 방법을 테스트합니다.

public DataTable ExecuteQuery(SqlConnection ActiveConnection, string Query, SqlParameterCollection Parameters)
{
    DataTable resultSet = new DataTable();
    SqlCommand queryCommand = new SqlCommand();
    try
    {
        queryCommand.Connection = ActiveConnection;
        queryCommand.CommandText = Query;

        if (Parameters != null)
        {
            foreach (SqlParameter param in Parameters)
            {
                 queryCommand.Parameters.Add(param);
            }
        }

        SqlDataAdapter queryDA = new SqlDataAdapter(queryCommand);
        queryDA.Fill(resultSet);
    }
    catch (Exception ex)
    {
        //TODO: Improve error handling
        Console.WriteLine(ex.Message);
    }

    return resultSet;
}

이 방법을 근본적으로 소요에 필요한 모든 비트와 조각을 추출하는 일부 데이터를 데이터베이스에서,그리고 데이터를 반환합에서 데이터 테이블 개체.

첫 번째 질문은 아마도 대부분의 복잡:나는 무엇을 해야도 테스트에서 이 같은 상황?

한번 정착 온는지 여부의 문제 또는 모의 데이터베이스 구성 요소나 하려고에 대한 테스트 실제 DB.

도움이 되었습니까?

해결책

무엇을 테스트하고 있습니까?

내 머리 꼭대기에서 세 가지 가능성이 있습니다.

A. DAO (Data Access Object) 클래스를 테스트하고 데이터베이스에 전달되는 값/매개 변수를 올바르게 마샬링하고 데이터베이스가 데이터베이스에 올바르게 마샬링/변환/포장 결과를 올바르게 마샬링합니다.

이 경우 데이터베이스에 전혀 연결할 필요가 없습니다. 데이터베이스 (또는 중간 계층, 예 : JDBC, (N) 최대 절전 모드, IBATIS)를 모의로 대체하는 단위 테스트 만 있으면됩니다.

B. (생성 된) SQL의 구문 정확성을 테스트하고 있습니다.

이 경우 SQL 방언이 다르기 때문에 RDBMS의 모든 단점을 조롱하려고 시도하는 대신 RDBM의 올바른 버전에 대해 (생성 된) SQL을 실행하려고합니다 (및 변경 기능이 변경되는 RDBMS 업그레이드 당신의 테스트).

C. 당신은 테스트하고 있습니다 시맨틱 주어진 기준 데이터 세트의 경우 SQL의 정확성, 즉 작업 (액세스/선택 및 돌연변이/인서트 및 업데이트)이 예상되는 새 데이터 세트를 생성합니다.

이를 위해 DBUNIT (기준선을 설정하고 결과 세트를 예상 결과 세트와 비교할 수 있음)와 같은 것을 사용하거나 여기에 기술을 사용하여 데이터베이스에서 전체 테스트를 수행하려고합니다. SQL 쿼리를 테스트하는 가장 좋은 방법.

다른 팁

이것이 (IMHO) 단위 테스트가 때때로 개발자 측에서 잘못된 보안 감각을 만들 수있는 이유입니다. 데이터베이스와 대화하는 응용 프로그램에 대한 경험에서 오류는 일반적으로 데이터가 예상치 못한 상태 (비정상적 또는 결 측값 등)의 결과입니다. 장치 테스트에서 데이터 액세스를 정기적으로 모킹하면 실제로 이러한 종류의 오류에 여전히 취약 할 때 코드가 훌륭하게 작동한다고 생각할 것입니다.

최선의 접근 방식은 테스트 데이터베이스를 편리하고 엉터리 데이터로 채워진 데이터베이스 구성 요소 테스트를 실행하는 것입니다. 사용자가 데이터를 망치는 것보다 훨씬 나아질 것임을 기억합니다.

단위 테스트의 요점은 다음과 같습니다 단위를 테스트하십시오 (duh) 분리 된. 데이터베이스 호출의 요점은 다음과 같습니다 통합 다른 장치 (데이터베이스). Ergo : 단위 테스트 데이터베이스 호출은 의미가 없습니다.

그러나 통합 테스트 데이터베이스 호출 (원하는 경우 단위 테스트에 사용하는 것과 동일한 도구를 사용할 수 있음).

하나님의 사랑을 위해, 이미 인구가 이미 인구가 많은 데이터베이스를 테스트하지 마십시오. 그러나 당신은 그것을 알고있었습니다.

일반적으로 사용자를 인증하거나 전화 번호부/조직 차트 항목 등을 찾는 등 각 쿼리가 검색 할 데이터의 종류에 대한 아이디어가 이미 있습니다. 당신은 당신이 어떤 분야에 관심이 있는지 알고 있으며, 어떤 제약이 존재하는지 알고 있습니다 (예 : UNIQUE, NOT NULL, 등등). 데이터베이스 자체가 아닌 데이터베이스와 상호 작용하는 코드를 테스트하고 있으므로 해당 기능을 테스트하는 방법에 대해 생각해보십시오. 필드가 가능하다면 NULL, 코드가 처리하는지 확인하는 테스트가 있어야합니다. NULL 올바르게 값. 필드 중 하나가 문자열 인 경우 (CHAR, VARCHAR, TEXT, & c), 탈출 한 캐릭터를 올바르게 처리하고 있는지 확인하십시오.

사용자가*를 데이터베이스에 넣고 그에 따라 테스트 케이스를 생성하려고한다고 가정합니다. 이를 위해 모의 개체를 사용하고 싶을 것입니다.

* 바람직하지 않거나 악의적이거나 유효하지 않은 입력을 포함합니다.

다음을 제외한 모든 것을 테스트 할 수 있습니다. queryDA.Fill(resultSet);

실행하자마자 queryDA.Fill(resultSet), 데이터베이스를 조롱/가짜로 만들거나 통합 테스트를하고 있습니다.

나는 통합 테스트가 나쁘다는 것을 보지 못합니다. 그것은 단지 다른 종류의 버그를 잡을 것이며, 거짓 부정과 잘못된 긍정의 다른 확률을 가지고 있다는 것입니다. 느린.

이 코드를 단위 테스트 한 경우 매개 변수가 올바르게 빌드되었는지 확인하고 명령 빌더가 올바른 수의 매개 변수를 생성합니까? 그들은 모두 가치가 있습니까? Nulls, 빈 줄 및 dbnull이 올바르게 처리됩니까?

실제로 데이터 세트를 채우는 것은 데이터베이스를 테스트하는 것입니다.이 데이터베이스는 DAL 범위에서 벗겨지는 색상의 구성 요소입니다.

엄밀히 말하면, 데이터베이스 또는 파일 시스템에서 쓰기/읽는 테스트는 단위 테스트가 아닙니다. (통합 테스트 일 수 있지만 Nunit 또는 Junit을 사용하여 작성 될 수 있지만). 단위 테스트는 단일 클래스의 작업을 테스트하여 종속성을 분리해야합니다. 따라서 인터페이스 및 비즈니스 로그 계층에 대한 단위 테스트를 작성할 때는 데이터베이스가 필요하지 않아야합니다.

자,하지만 데이터베이스 액세스 계층을 어떻게 테스트합니까? 나는이 책의 조언을 좋아한다 : xunit 테스트 패턴 (링크는 책의 "테스트 w/ db"장을 가리 킵니다. 키는 다음과 같습니다.

  • 왕복 테스트를 사용하십시오
  • 데이터 액세스 테스트 픽스처에 너무 많은 테스트를 작성하지 마십시오. "실제"단위 테스트보다 훨씬 느리게 실행되므로
  • 실제 데이터베이스로 테스트를 피할 수있는 경우 데이터베이스없이 테스트하십시오.

단위 테스트의 경우 일반적으로 데이터베이스를 조롱하거나 가짜로 표시합니다. 그런 다음 종속성 주입을 통해 모의 또는 가짜 구현을 사용하여 방법을 테스트하십시오. 또한 데이터베이스에서 제약, 외국의 주요 관계 등을 테스트 할 통합 테스트가있을 것입니다.

테스트 할 내용에 관해서는 메소드가 매개 변수의 연결을 사용하고 쿼리 문자열이 명령에 할당되었으며 반환 된 결과 세트가 기대를 통해 제공하는 것과 동일해야합니다. 채우기 방법에서. 참고 - 채우기 메소드보다 값을 반환하는 GET 메소드를 테스트하는 것이 더 쉽습니다. 매개 변수를 수정합니다.

이를 위해서는 제대로 하지만 당신이 사용해야 하는 일부 종속성을 주입(DI),그리고 한다.순이 몇 가지가 있습니다.나는 현재 사용하는 유니티 Framework 하지만 다른 사람이 있다는 것은 쉽습니다.

여기에는 하나의 링크는 본 사이트에 이 주제,하지만 다른 사람이 있다:성 주입니다.물에 대한 참조를 제공합니다.

이것을 사용하면 보다 쉽게 모의 다른 부분의 응용 프로그램에 의해 다만 모의 클래스 인터페이스를 구현하도록 제어할 수 있습니다 그것이 어떻게 반응할 것이다.그러나,이것은 또한 수단을 설계하는 인터페이스입니다.

이후 요청에 대한 최고의 관행이 될 것 이라고 하나,IMO.

그 뿐만 아니라 친구들과 함께 누가하여 컴퓨터바이러스에 의해야 하는 경우가 아니면,제안으로 다른 것입니다.

필요하신 경우에는 시험이 특정한 행동 등의 외국인 핵심과의 관계를 모두 삭제할 수 있습니다 원하는 데이터베이스 쓰기에 대한 테스트는하지만,일반적으로 가지 않는 실제 데이터베이스가 최고,esp 이상 이후 한 사람이 실행될 수 있습 단위 테스트는 시간에 그리고 만약 그들이 동일한 데이터베이스 시험 실패 할 수 있습으로 예상되는 데이터 변경될 수 있습니다.

편집:여 데이터베이스 단위 테스트 난로,이것은 그냥 t-sql 을 사용하여 몇 가지 설정,테스트 및 분해.http://msdn.microsoft.com/en-us/library/aa833233%28VS.80%29.aspx

JDBC 기반 프로젝트에서 JDBC 연결을 조롱 할 수 있으므로 각 테스트 케이스가 분리되어 라이브 RDBM없이 테스트를 실행할 수 있습니다 (데이터 충돌 없음).

인증을 확인할 수 있습니다. 지속성 코드는 적절한 쿼리/매개 변수를 전달합니다 (예 : https://github.com/playframework/playframework/blob/master/framework/src/anorm/src/test/scala/anorm/parameterspec.scala)) 및 JDBC 결과 (구문 분석/매핑)를 예상대로 처리합니다 ( "데이터베이스에서 일부 데이터를 추출하기 위해 필요한 모든 비트 및 조각을 가져 와서 데이터를 데이터를 데이터로 반환합니다").

Jooq 또는 내 프레임 워크 Acolyte와 같은 프레임 워크는 다음을 위해 사용될 수 있습니다. https://github.com/cchantep/acolyte .

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