programing

데이터 집약적 PL/SQL 응용 프로그램을 테스트하는 방법(단위)

instargram 2023. 9. 19. 20:46
반응형

데이터 집약적 PL/SQL 응용 프로그램을 테스트하는 방법(단위)

우리 팀은 기존의 거대한 Oracle 시스템을 확장하는 프로젝트에 따라 작성된 새로운 코드를 유닛 테스트할 의향이 있습니다.

이 시스템은 PL/SQL로만 작성되며, 수천 개의 테이블과 수백 개의 저장 프로시저 패키지로 구성되며, 대부분 테이블에서 데이터를 가져오거나 다른 데이터를 삽입/업데이트합니다.

우리의 연장은 예외가 아닙니다.대부분의 함수들은 서로 결합된 많은 테이블들을 통해 상당히 복잡한 SELECT 문 a에서 데이터를 반환하거나(반환하기 전에 약간의 논리가 추가됨) 복잡한 데이터 구조에서 다른 구조로 변환합니다(다른 방식으로 복잡함).

그러한 코드를 단위 테스트하는 가장 좋은 방법은 무엇입니까?

기존 코드베이스에 대한 단위 테스트가 없습니다.설상가상으로 패키지, 트리거 및 보기만 소스 제어, 테이블 구조("변경 테이블" 항목 포함), 버전 제어 이외의 채널을 통해 필요한 데이터 변환이 배포됩니다.우리 프로젝트 범위 내에서 이를 변경할 수 있는 방법은 없습니다.

운영 환경에 매주 새로운 코드가 배포되므로 테스트 데이터 세트를 유지하는 것은 불가능한 것 같습니다. 대개 사전 통지 없이 데이터 구조를 변경하는 경우가 많기 때문입니다(여기에 열을 추가하고 하나를 제거합니다).

저희에게 도움이 될 만한 어떤 제안이나 참고를 해주시면 감사하겠습니다.일부 팀원들은 유닛 테스트를 시작하는 방법이 PL/SQL 데이터 집약적인 레거시 시스템("책에서 나온" 그린필드 Java 프로젝트만 해당)을 포함하지 않는 경우가 많습니다.

PL/SQL에 대한 여러 가지 테스트 도구가 있습니다.Steven FeuersteinutplsqlQuest Code Tester for Oracle(이전 QUTE)의 두 가지를 작성했습니다.저는 utplsql의 열렬한 팬이지만 더 이상 활성화된 지원 커뮤니티가 없습니다(부끄럽습니다).특히 시험기구를 설치할 때는 상당히 장황한 경향이 있습니다.이것은 순수 PL/SQL 패키지라는 기본 가상을 가지고 있습니다. 소스 코드는 약간 애매하지만 FOSS입니다.

QCTO는 GUI와 함께 제공되는데, 이는 다른 퀘스트 제품과 함께 제공됩니다.TOD - Windows(윈도우) 전용입니다.테스트 데이터 생성을 정확하게 자동화하지는 않지만 이를 지원하는 인터페이스를 제공합니다.다른 퀘스트 제품과 마찬가지로 QCTO도 라이선스가 있지만 프리웨어 카피가 있습니다.

Steven(공개된 그는 제 Oracle 영웅 중 한 명입니다)은 모든 PL/SQL 테스트 도구의 기능 비교를 작성했습니다.분명 QOTC가 상위권에 들지만 비교는 정직하다고 생각합니다.확인해보세요.

utplsql의 테스트 고정장치에 대한 조언

유닛 테스트를 위해 테스트 데이터를 관리하는 것은 매우 힘든 일일 수 있습니다.유감스럽게도 utplsql은 부담을 많이 주지 않습니다. 그래서

  • 알려진 값에 대해 항상 테스트:
    • dbms_random을 사용하지 마십시오.
    • 값이 중요하지 않은 열로 시퀀스 사용을 제한합니다.
    • 날짜도 까다롭습니다.하드코딩 날짜를 피합니다. sysdate로 채워진 변수를 사용합니다.다를 .add_months(),last_day(),interval,trunc(sysdate, 'MM').
  • 테스트 데이터를 다른 사용자와 분리합니다.처음부터 다시 만들어 보세요.가능한 한 고유한 가치를 사용합니다.
  • 테스트 데이터는 필요한 만큼만 만듭니다.체적 검사는 다른 책임입니다.
  • 데이터를 변경하는 테스트 절차에서는 각 단위 테스트에 대한 특정 레코드를 생성합니다.
  • 또한: 다른 테스트의 입력을 제공하기 위해 한 테스트의 성공적인 출력에 의존하지 마십시오.
  • 단순히 데이터에 대해 보고하는 테스트 절차를 수행할 때는 해당 시 단위 테스트 간에 기록을 공유합니다.
  • 가능할 때마다 프레임워크 데이터(예: 참조된 기본 키)를 공유합니다.
  • 자유 텍스트 필드(이름, 설명, 주석)를 사용하여 레코드를 사용하는 테스트 또는 테스트를 식별합니다.
  • 새 기록 작성에 관련된 작업 최소화:
    • 테스트 제품군과 표의 제약 조건에 필요한 값만 할당합니다.
    • 기본값을 가능한 많이 사용합니다.
    • 가능한 한 절차화합니다.

그 밖에 유의해야 할 사항:

  • 테스트 고정 장치를 설정하는 것은 시간이 많이 걸리는 운동일 수 있습니다. 한 번 할 수 하는 절차를 .ut_setup그 자체. 합니다.특히 읽기 전용 기능을 테스트할 때 유용합니다.
  • 테스트 데이터를 만드는 것은 그 자체로 프로그래밍 연습이므로 버그가 발생하기 쉽습니다.
  • utplsql의 모든 기능을 사용합니다.utAssert.EqQuery,utAssert.EqQueryValue,utAssert.EqTable,utAssert.EqTabCount그리고.utAssert.Eq_RefC_Query가 휘발성 데이터의 값을 유추할 때 매우 유용한 기능입니다.
  • 테스트 실행이 예상했던 대로 되지 않았다는 것을 진단할 때 사용된 데이터를 갖는 것이 유용할 수 있습니다.그러니 구멍을 내는 걸 고려해 보세요.ut_teardown절차 및 시작 시 테스트 데이터 삭제ut_setup.

레거시 코드 처리

게리의 게시물에 댓글을 달아보니 유용한 것이 하나 더 떠올랐습니다.Steven F는 테스트 퍼스트 운동의 자바 선봉장인 Junit의 PL/SQL 구현으로 ulplsql을 작성했습니다.그러나 TDD의 기법은 많은 양의 레거시 코드에도 적용될 수 있습니다(이러한 맥락에서 레거시 코드는 어떠한 단위 테스트 없이 프로그램의 임의의 집합입니다).

가장 중요한 것은 바로 유닛 테스트를 받을 필요가 없다는 것입니다.점진적으로 시작합니다.새로운 것에 대한 단위 테스트를 구축합니다. 테스트 우선입니다.변경을 적용하기 전에 변경할 비트에 대한 단위 테스트를 작성하여 변경한 후에도 계속 작동한다는 것을 알 수 있습니다.

이 부분에 대해서는 많은 생각이 있지만, (부끄럽지만 어쩔 수 없이) 주로 OO 프로그래머들에게서 비롯됩니다.마이클 페더스가 주인공입니다.레거시 코드를 효과적으로 사용하는 그의 기사를 읽어 보십시오.만일 당신이 그것이 도움이 된다고 생각한다면 그는 그 후에 같은 이름의 책을 썼습니다.

다음 시나리오를 사용합니다.

FUNCTION ret_count (local_client_id IN number) RETURN NUMBER IS
  v_ret number;
BEGIN
  SELECT count(*) INTO v_ret FROM table_1 WHERE client_id = local_client_id;
  RETURN v_ret;
END;

아주 간단한 기능이지만 잘못될 수 있는 일들이 가득합니다.데이터 유형 변환, 인덱싱, 통계는 모두 쿼리 경로, 성능 및 경우에 따라 오류에 영향을 미칠 수 있습니다.또한 세션 설정(언어적 선호)과 같은 느슨한 결합이 많습니다.누군가가 와서 table_1에 "LOCAL_CLIENT_ID" 열을 추가하면 함수의 전체 논리가 바뀝니다.

저는 개인적으로 TDD가 이 환경에 적합하지 않다고 생각합니다.잘 아는 사람들의 코드 리뷰는 문제를 발견할 가능성이 더 높습니다.

돈이 있다면 Oracle의 RAT(Real Application Testing)를 통해 회귀 테스트를 확인해 보십시오.

저는 PL/SQL 코드를 단위 테스트하기 위해 DbFit을 사용했습니다.한번 해보라구요.

utPLSQL이 도움이 될 수도 있지만 테스트 데이터를 유지하는 더 나은 방법이 필요할 것 같습니다.스윙벤치도 한 번 살펴보실 수도 있습니다.

언급URL : https://stackoverflow.com/questions/2668094/how-to-unit-test-data-intensive-pl-sql-application

반응형