문제

나는 DAL을 테스트 할 준비가 된 간단한 프로젝트의 시점에 도달했습니다.

나는 기본적으로 몇 가지 매우 간단한 기능을 가진 FoodataAccess라는 클래스를 가지고 있습니다.

int InsertFoo(string fooName)
void UpdateFoo(int fooID, string fooName)
void InsertFoosDepedency(int fooID, string someValue)

내가 한 일은 단위 테스트 프로젝트에 4 개의 SQL 스크립트를 넣었습니다.

1) 생성 (단위 테스트) 데이터베이스 스크립트, 2) 개체 만들기 스크립트 만들기, 3) 조회 테이블 값 삽입 및 4) 모든 조회 테이블 값 삭제

아이디어는 먼저 프로젝트를 사용하는 사람이라면 누구나 수동으로 스크립트 1-3을 일회성 설정으로 실행해야합니다. 그런 다음 각 장치 테스트의 시작시 스크립트 #4를 실행합니다 ... (작은 앱에서는 테스트 수준에서 모든 앱을 실행할 수도 있습니다).

좋아, 지금까지 너무 좋아 ...

따라서 빈 슬레이트로 단위 테스트 데이터베이스 설정이 있습니다. 첫 번째 함수 insertFoo ()를 테스트하는 것은 매우 간단합니다. 그 함수를 호출 한 다음 assert (executesql ( "count (*)에서 선택 (*))> 1), assert (executesql ("t_foo에서 fooname select ")) 등을 주장합니다.

내가 약간 붙어있는 곳은 예제의 세 번째 기능이나 업데이트와 같은 종속성이 필요한 것입니다.

내 테스트 범위에 대한 모든 외국의 주요 제약 조건을 일시적으로 삭제하는 것이 합리적입니까? 그렇지 않으면, insertFoosDepedency (int foOid, string somevalue) 함수를 단위 테스트하려면 먼저 임의의 SQL을 실행해야합니다 (FOO 테이블에 레코드를 수동으로 삽입하고 FOOD를 반환).

아니면 후자를해야합니까?

모든 피드백은 대단히 감사합니다.

업데이트 : Inline SQL로 깨끗하게 작동하여 부양 가족을 만듭니다. 나는 단지 단위 테스트 dal을위한이 방법에 대한 의견과 비평가를 찾고 있다고 생각합니다. 다시 한 번 감사드립니다

도움이 되었습니까?

해결책

이것은 내가하는 일과 매우 비슷하게 들립니다. 데이터베이스의 모든 데이터를 각 테스트의 시작 그런 다음 테스트가 단계를 설정하는 데 필요한 테스트를 구축하십시오. 그래서 UpdateFoo 나는 가질 것이다

void update_existingKey_updatesValue() {
   String expected = "jeff";

   clearDatabase();
   // Note I would use dbUnit.
   executeSQL("insert into foo values (1, 'fred')");

   DAL subject = new DAL(...);
   subject.update(1, expected);  

   //Note I would use dbUnit.   
   String actual = executeSQL("select name from foo where id = 1"); 
   assert(expected, actual);
}

Java에서는라는 도구를 사용합니다 DBUNIT, 당신의 메소드 이름은 c#을 제안하므로 dbunit.net 그러나 나는 이것을 사용한 적이 없다. 이것은 데이터베이스를 채우고 데이터베이스의 내용을 확인하는 더 좋은 (IMO 어쨌든) 방법을 제공합니다.

다른 팁

내가 말할 것 절대 테스트를 위해 스키마와 함께 뭉개십시오. 다시 넣지 못하거나 코드를 다시 넣지 않으면 실패하면 매우 빨리 엉망이됩니다.

당신은 사용할 수 있습니까? 모의 개체?

그렇지 않으면, 당신이 할 수있는 모든 것은 각 테스트에 대해 데이터베이스 프리 레크를 설정하는 것입니다.

각 테스트마다 별도의 클래스를 고려하고 설정 및 분해 방법을 사용하여 데이터베이스를 테스트에 적합한 조건으로 가져옵니다.

또는 테스트 방법에서 테스트 별 설정을 수행하면됩니다 (그리고 나중에 DB를 비우기 위해 분해를 사용 할 수 있습니다).

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