2012-04-24 55 views
5

更新:我在尋找一種技術來計算的數據爲我的算法(或爲此事任意算法)的所有邊緣案件。
什麼我嘗試到目前爲止只是在想什麼可能是邊緣情況+產生一些「隨機」數據,但我不知道我怎麼能更確定我沒有錯過的東西真正的用戶將能夠搞亂..
如何生成測試數據的「組通過數據的其它行」算法

我想檢查我沒有錯過一些重要的事情在我的算法,我不知道如何生成測試數據,以涵蓋所有可能的情況:

任務是報告每個Event_Date的數據快照,但爲可能屬於的下一個Event_Date - 見第2組)對輸入和輸出數據說明

input and output data illustration

算法

  1. 使event_date個列表和計算next_event_date對於他們
  2. 將結果加入main_audit_table並計算每個快照的最大transaction_id(我的illustra中的組1-4薦) - 由idevent_date以及基於transaction_date < next_event_date是否是真實的2個選擇或不
  3. 細分電子郵件加入main_audit_table的結果從同一transaction_id
  4. 得到其他數據一起costs_audit_table的結果 - 使用最大transaction_id即小於transaction_id從結果

問題(S)

  • 如何生成可覆蓋所有可能場景的測試數據,因此我知道我的算法是正確的?
  • 你可以在我的算法邏輯中看到任何錯誤嗎?
  • 有沒有更好的論壇來處理這類問題?

代碼(即需要進行測試):

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 2012-04-24 20:55:33

+0

@Kodra模型 - 它們是* IBM Tivoli Service Request Manager *審計表(具有幾十個自定義字段的a_workorder)+自定義審計表 - 無最新文檔和我的逆向工程技能與您的一樣好。 。 – Aprillion 2012-04-24 22:20:08

+0

@Kodra我的算法的第2點應該清楚地分配組的作業 - 如果沒有,請告訴我究竟什麼不清楚,所以我可以重新修改它,謝謝 – Aprillion 2012-04-24 22:21:34

回答

3

公用表表達式(CTE)不僅埋葬的複雜性,並降低長SQL片段的複製的好方法,但也是一種簡單的方式來表示測試數據,就好像它來自永久表。至少,CTE將把查詢的主要組件集中在頂部,讓您在整個聲明的其餘部分通過標籤引用它們。 Graeme Birchall的DB2 SQL Cookbook(維護良好,免費的電子書)有一些很好的示例以及其他高級SQL模式。 Joe Celko是關於如何讓SQL爲你做更多繁重工作的想法的另一個很好的來源。

+0

+1對於一個偉大的提示,但實際上我沒有問題插入數據到真正的表 - 我如何計算需要測試的邊緣情況? (我可以生成大量的隨機數據並錯過真實用戶會產生的情況)您是否知道這方面的技術? – Aprillion 2012-04-25 21:10:11