데이터베이스 작업시 OO 및 테스트 가능


16

데이터베이스를 사용하면서 작업 단위를 테스트 할 수있는 OOP 전략에는 어떤 것이 있습니까? User 클래스가 있고 프로덕션 환경이 MySQL에 대해 작동한다고 가정 해보십시오. PHP를 사용하여 여기에 표시된 몇 가지 가능한 접근 방법이 있습니다.

  1. 백엔드 데이터 소스를 추상화하기 위해 load()save()에 대한 인터페이스가있는 $ data_source를 전달 하십시오. 테스트 할 때 다른 데이터 저장소를 전달하십시오.

    $ user = 새로운 사용자 ($ mysql_data_source);
    $ user-> load ( 'bob');
    $ user-> setNickname ( '로비');
    $ user-> save ();
    
  2. 데이터베이스에 액세스하고 결과 행을 사용자의 생성자에게 전달하는 팩토리를 사용하십시오. 테스트 할 때 $ row 매개 변수를 수동으로 생성하거나 UserFactory :: $ data_source에서 오브젝트를 조롱하십시오. (변경 사항을 레코드에 저장하려면 어떻게해야합니까?)

    class UserFactory {
        static $data_source;
    
        public static function fetch( $username ) {
            $row = self::$data_source->get( [params] );
    
            $user = new User( $row );
            return $user;
        }
    }
    

나는이 디자인 패턴깨끗한 코드를 내 옆에 여기,하지만 난 적용 개념을 찾기 위해 사투를 벌인거야.


답변:


11

Martin Fowlers 의 Enterprise Application Architecture 패턴 ( 자신의 웹 사이트에서 카탈로그를 제공 )도 있습니다.

여기에는 데이터 액세스를 추상화하기위한 몇 가지 패턴이 설명되어 있습니다. 가장 먼저 설명하는 방법은 Active Record 입니다. 두 번째 방법은 테이블 데이터 게이트웨이 와 비슷합니다 .

더 좋은 방법은 O / RM을 사용하여 데이터 액세스 코드를 직접 작성하지 않아도됩니다. Y2K에 대해 걱정 한 이후로 PHP를 사용하지 않았지만 wikipedia에는 ​​옵션 목록이 있습니다 . 그래도 그들이 좋은지 모르겠습니다. 그러나 O / RM에서 찾아야 할 것들을 알려줄 수 있습니다.

  • 지속성 무지 : O / RM은 데이터 액세스 전략에 참여하기 위해 비즈니스 객체가 특정 인터페이스 / 클래스에서 파생되도록 강요해서는 안됩니다.
  • 관계 매핑 : 개체 간 관계를 매핑 할 수 있어야합니다 (고객은 주문, 주문은 품목, 품목은 제품 등).
  • 계층 적 매핑 : 클래스 계층 구조를 데이터베이스에 매핑 할 수 있어야합니다.
  • 쿼리 구문 / 기준 지원 : 데이터베이스가 아닌 개체 측면에서 런타임에 쿼리를 만들 수 있어야하며 O / RM은 데이터베이스에서 쿼리를 번역하고 실행해야합니다. 쿼리가 문자열 대신 강력한 형식의 체인 인 경우 추가 포인트.

고려해야 할 다른 요소가 있지만 가장 중요한 요소입니다. 도움이 되었기를 바랍니다.


6

IMHO 그것은 당신이 테스트하고자하는 것에 달려 있습니다. 비즈니스 로직을 단위로 테스트 하려면 데이터 액세스를 스텁 / 모의해야합니다 ( Martin Fowler ) 당신의 첫 제안은 좋은 시작입니다. 이 stackoverflow 질문 은 멋진 C # 예제를 제공합니다 (PHP 샘플을 찾으려고했지만 찾을 수 없었습니다).

데이터 액세스 자체를 테스트하려는 경우 더 이상 단위 테스트라고하는 것이 아니라 통합 테스트입니다. 일반적인 지침을 보려면 여기 를 읽으 십시오 . 이 stackoverflow 질문 에는 흥미로운 링크가 있습니다.

데이터베이스에서 저장 프로 시저 논리를 테스트하려면 xUnit TestPattern을 확인하십시오.

도움이 되었기를 바랍니다


2

이것이 즉각적으로 유용한 답변은 아니지만 데이터베이스 테스트 가능성에 대해 정말로 우려하는 경우 Ruby on Rails에서 어떻게 수행되는지 조사해야합니다. 내가 아는 한, 아무도 주제를 더 좋고 직관적으로 다루지 않았습니다.


2
Ruby on Rails는 기본적으로 활성 레코드 패턴을 구현합니다. 링크도 제공 할 수 있습니다 : en.wikipedia.org/wiki/Active_record_pattern
Spoike

0

이런 종류의 문제에 대해 Symfony Framework 솔루션을 확인하는 것이 좋습니다. Symfony는 기능 테스트가 포함 된 PHP OO 프레임 워크입니다.

여기 링크가 있습니다 . 그들은 당신이 생각하는 것과 같은 것을 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.