5

UPDATE에 대한 테스트 데이터를 생성하는 방법 : 내 알고리즘 (또는 그 문제에 대한 임의의 알고리즘)의 모든 가장자리 경우에 데이터를 계산하는 기술을 찾고 있어요.
내가 지금까지 시도한 은 단지 가장자리의 사례 + 일부 "임의"데이터를 생성하는 것에 대해 생각하고 있지만 실제 사용자가 할 수있는 뭔가를 놓치지 않았다는 것을 어떻게 확신 할 수 있을지 모르겠다.
는 "다른 행의 데이터를 기준으로 그룹화"알고리즘

내가 내 알고리즘에서 중요한 것을 놓치지 않았다 검사 할 ... 망치와 나는 가능한 모든 상황을 커버하는 테스트 데이터를 생성하는 방법을 모른다 :

작업가이다 Event_Date에 대한 데이터의 스냅 샷을보고하지만 에 속하는 편집에 대해 별도의 행을 만듭니다. Event_Date - 입력 및 출력 데이터 그림에 그룹 2)를 참조하십시오 :

  1. event_date의 목록을 확인하고
  2. 그들을 위해 next_event_date의 계산 :

    input and output data illustration

    알고리즘 결과를 main_audit_table에 합류하고 각 스냅 샷에 대해 가장 큰 transaction_id을 계산하십시오 (내 illustra의 그룹 1-4 기) - id, event_date에 의해 transaction_date < next_event_date 사실인지에 따라이 옵션 여부

  3. 별로 그룹화 된 결과에 main_audit_table이 같은 transaction_id
  4. 에서 다른 데이터를 얻기 위해 가입 결과에 costs_audit_table에 가입 - 가장 큰 transaction_id를 사용

      : 즉, 결과에서보다 작은 transaction_id에게

질문 (들)입니다

  • 어떻게 가능한 모든 시나리오를 다루는 테스트 데이터를 생성 할 수 있습니까?
  • 내 알고리즘 로직에서 실수를 볼 수 있습니까?
  • 이런 종류의 질문에 대한 더 나은 포럼이 있습니까? (테스트 필요)
  • 코드 :

    select 
        snapshots.id, 
        snapshots.event_date, 
        main.event, 
        main.transaction_date as last_change, 
        costs.costs as costs_2012 
        from (
        --snapshots that return correct transaction ids grouped by event_date 
        select 
         main_grp.id, 
         main_grp.event_date, 
         max(main_grp.transaction_id) main_transaction_id, 
         max(costs_grp.transaction_id) costs_transaction_id 
        from main_audit_table main_grp 
        join (
         --list of all event_dates and their next_event_dates 
         select 
         id, 
         event_date, 
         coalesce(lead(event_date) over (partition by id order by event_date), 
           '1.1.2099') next_event_date 
         from main_audit_table 
         group by main_grp.id, main_grp.event_date 
        ) list on list.id = main_grp.id and list.event_date = main_grp.event_date 
        left join costs_audit_table costs_grp 
         on costs_grp.id = main_grp.id and 
         costs_grp.year = 2012 and 
         costs_grp.transaction_id <= main_grp.transaction_id 
        group by 
         main_grp.id, 
         main_grp.event_date, 
         case when main_grp.transaction_date < list.next_event_date 
          then 1 
          else 0 end 
    ) snapshots 
        join main_audit_table main 
        on main.id = snapshots.id and 
         main.transaction_id = snapshots.main_transaction_id 
        left join costs_audit_table costs 
        on costs.id = snapshots.id and 
         costs.transaction_id = snapshots.costs_transaction_id 
    
    +0

    이 데이터를 모델링하는 방법과 이러한 그룹을 할당하는 방법을 명확히 할 수 있습니까? – Kodra

    +0

    @Kodra 모델로 - IBM Tivoli Service Request Manager * 감사 테이블 (수십 개의 사용자 정의 필드가있는 a_workorder) + 사용자 정의 감사 테이블 - 최신 문서 및 리버스 엔지니어링 기술이없는 것이 좋습니다. – Aprillion

    +0

    @Kodra 내 알고리즘의 2 번에서 그룹 할당이 명확해야합니다. 그렇지 않다면 정확하지 않은 점을 말해주세요. 덕분에 다시 쓸 수 있습니다. – Aprillion

    답변

    3

    공통 테이블 표현식 (CTE)뿐만 아니라 복잡성을 묻어 긴 SQL 조각의 중복을 줄일 수있는 좋은 방법,하지만 테스트 데이터를 영구 테이블에서 가져온 것처럼 쉽게 표현할 수 있습니다. 최소한 CTE는 쿼리의 주요 구성 요소를 맨 위에 표시하여 나머지 문구에서 해당 레이블로 참조 할 수 있습니다. Graeme Birchall의 DB2 SQL Cookbook (잘 관리 된 무료 전자 책)에는이 고급 SQL 패턴과 다른 고급 SQL 패턴의 좋은 예가 있습니다. Joe Celko는 SQL을 어떻게하면 더 힘들게 만들지에 대한 아이디어를 얻을 수있는 또 다른 좋은 정보원입니다.

    +0

    +1에 큰 도움이되었지만 사실은 데이터를 삽입하는 데 문제가 없습니다. 실제 테이블 - 어떻게 테스트해야 할 엣지 케이스를 계산할 수 있습니까? (나는 많은 무작위 데이터를 생성 할 수 있고 실제 사용자가 생산할 수있는 경우를 놓칠 수 있습니다.)이 기술을 알고 있습니까? – Aprillion

    관련 문제