簡體   English   中英

如何測試程序處理以不可預測的格式存儲的大量數據

[英]How to test a program processing large amounts of data stored in an unpredictable format

我該怎么辦

我正在嘗試操作存儲在Excel文件中的一些相當大量的數據(其中一個工作簿有多達150個電子表格)。 這些操作的結果可能在數據庫表中產生大約800.000行。

問題

存儲在電子表格中的數據具有不可預測的格式。 生成這些電子表格的公司沒有用於導出這些文件的固定/文檔格式,有時會出現錯誤數據。 例如,大多數年份表示為“2009”,但有些情況下一年表示為“20”。 其他例子,數據在這些文件中沒有真正規范化,因此我使用分隔符來分割某些單元格的值。 有時這些分隔符會改變。

有些事情是我無法預測的,只有在我的程序已經進化過很多部分的可用數據后才能發現它們。

這個問題

如何在這種情況下測試程序的正確性? 或者更確切地說,如何在不運行整個可用數據的情況下實現產品的穩定版本?

如果出現某種意外問題,我應采取防御措施並拋出異常嗎? 然后程序的主循環可以捕獲並記錄它們並繼續使用可用數據? 這會產生一些已處理的數據,但這意味着在程序的后續迭代中,我必須檢查先前迭代中已經存在於數據庫中的內容(我不喜歡)。

你怎么看? 你會如何解決這個問題?

如果沒有關於數據格式的規范,那么任何事情都是可以接受的。

如果不是,則存在明確或隱式的數據規范。 我現在試着把它釘下來。 如果你無法獲得足夠明確的數據定義來編寫你的程序,以便它可以毫無錯誤地運行,那么我會說你冒很大的風險會導致一些嚴重的損壞,具體取決於這些數據的來源。正在使用。

您應編寫程序,以便在運行不符合規范的數據時拋出異常或記錄錯誤。 然后,在可用數據的PART上運行該程序,直到它運行無例外。 這可以被視為用於開發程序的培訓集。 然后,使用一些保存的數據作為TEST集。 這將使您估計程序將在生產中生成的異常/錯誤數量。

過度擬合是一種常見的機器學習概念,但它對其他任務很有用 - 例如程序開發。 令我驚訝的是,開發人員如何編寫一系列單元測試,編寫應用程序以在其上執行良好的編碼,然后期望在生產中具有類似或無錯誤的性能。

如果您不願意采取所有這些步驟(即在基本上所有數據上運行代碼 - 因為測試集也在使用數據),那么我會說任務太大而無法完成。

順便說一下,您可能想要創建一個新的,規范化的(在某種意義上,這些東西被簡化了),而不是創建一個非常奇怪和特殊的格式定義來解釋當前數據中的所有“錯誤”。數據規范,然后編寫一個“錯誤的文檔修補程序”,可以在錯誤的文檔上運行來修復數據。

如果生成數據的應用程序仍在生產中,那么您可能需要轉到此應用程序的開發人員以獲取新規范的購買。 一旦你有了,你就可以開始針對他們的應用程序記錄錯誤,所以希望錯誤的文檔修補程序可以退役。

更有可能的是,我猜測軟件開發人員早已不復存在,沒有人能夠理解代碼,如果它甚至可以運行的話。

如何在這種情況下測試程序的正確性? 或者更確切地說,如何在不運行整個可用數據的情況下實現產品的穩定版本?

對於每種數據類型,我都會對允許的值設置合理的約束。 如果某個單元格違反了這些約束,則拋出一個異常,其中包含失敗的數據及其數據類型。 如果一條數據違反了其約束條件,您可以修改源代碼以包含該數據所需的其他約束條件,以及使其統一的轉換方法。

舉一個你給出的日期的例子,最初日期的約束條件是它只能是四位數。 當程序遇到“20”時會拋出異常。 然后你可以允許兩位數日期,以及一種將兩位數日期轉換為四位數日期的方法,以便進一步處理。

一個問題是,你會不止一次運行你的程序? 根據您的問題,您可能只想運行一次,然后您將使用數據庫中的數據。

在這種情況下,您可以非常防守 - 每當出現意外數據時拋出異常。 在更大的數據集上重復運行程序。 最初,通過更改代碼來解決任何異常,因為這是一個很好的經驗法則,您首先找到的異常將是常見的。 您可能希望在運行之間清空輸出數據庫。

稍后,您將發現罕見的異常,這些異常可能僅在輸入中出現幾次。 只需手動解決這些問題,然后自己在數據庫中插入相應的行。 或者編寫另一個小程序來讀取您的異常信息並插入新行,而不是再次運行整個大程序。

通常我會按照@MarkJ的建議來做這些事情,並且我在單元測試中對整個事情進行編碼。

所以我編寫了一個小數據文件,它最初只包含幾行普通數據。 那個單元測試編號為1。

然后我對一些數據進行快速視覺掃描,以發現任何明顯的異常。 單元測試2到n。

最后,我編寫解析器代碼,直到它通過所有單元測試,並拋出並記錄所有未管理數據的異常。

然后我使用這些奇怪的數據位來進行新的單元測試,並改進解析器,直到它也可以通過它們。

雖然有時候容納一些非常奇怪的數據會增加解析器的復雜性而不是它的價值,我只會記錄異常,轉儲它,繼續前進。 這是專業判斷的問題。

如何處理每一個數據(所以你不必檢查欺騙)。 那些傳遞進入數據庫。 異常進入異常文件。 用戶可以打開異常文件並對數據進行更正/修改。 然后他們可以在異常文件上運行您的程序。

這將隔離未處理的數據以供用戶更正並阻止您處理相同的數據兩次(或更多次)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM