簡體   English   中英

對編譯器輸出進行單元測試

[英]Unit testing for a compiler output

作為大學項目的一部分,我們必須為玩具語言編寫一個編譯器。 為了對此進行一些測試,我正在考慮如何最好地編寫像單元測試這樣的東西。 由於編譯器是用haskell編寫的,因此Hunit和quickcheck都可用,但可能不太合適。

我們怎么做任何非手動測試? 我唯一的想法是有效編譯到haskell,看看輸出是什么,並使用一些shell腳本將其與編譯程序的輸出進行比較 - 這是相當多的工作,並不是太優雅無論是。

單元測試是為了幫助我們,而不是評估工作本身的一部分。

這實際上取決於您編寫的編譯器的哪些部分。 如果您可以保持階段不同以幫助隔離問題,那就太好了,但是,在任何階段,甚至在集成級別,單元測試由成對的源代碼和手工編譯的代碼組成是完全合理的。 您可以從最簡單的法律程序開始,並確保您的編譯器輸出與手動編譯時相同的內容。

隨着復雜性的增加,手工編譯變得笨拙,編譯器保留其所做的某種日志是有幫助的。 然后,您可以查閱此日志以確定是否為給定的源程序觸發了特定的轉換或優化。

根據您的語言,您可以考慮從程序片段集合中生成隨機程序(在QuickCheck中)。 該生成器可以測試編譯器的穩定性,以及處理可能無法預料的輸入的能力。

單元測試應測試一小段代碼,通常是一個類或一個函數。 詞法和語義分析將各自進行單元測試。 Intermediate Represetation生成器也有自己的測試。

單元測試涵蓋了一個簡單的測試用例:它調用在受控環境中進行單元測試的函數,並驗證(斷言)函數執行的結果。 單元測試通常只測試一個行為,並具有以下結構,稱為AAA:

  • 安排:創建調用函數的環境
  • 行動:調用該功能
  • 斷言:驗證結果

一旦程序輸出進入控制台(例如標准輸出),測試就變得更加困難。 然后你必須使用一些外部工具,如grepexpect檢查輸出。

盡可能長時間地保持數據結構中函數的返回值。 如果編譯器的輸出是匯編代碼,則在內存中構建一個字符串(或字符串列表)並在最后一刻輸出它。 這樣,您可以更直接,更快速地測試字符串的內容。

看看shelltestrunner 以下是一些示例測試 它也在這個編譯器項目中使用

一個選項是這個人正在做的方法來測試真正的編譯器:與你可以對話的人一起聚會,每個人編譯並運行相同的程序集,然后比較輸出。 請務必添加您使用的每個測試用例,因為更多輸入會使其更有效。 通過自動化和源代碼控制獲得一點樂趣,您可以使其易於維護。

一定要先得到教授的確定,但由於你只是分享測試用例和輸出,我看不出他有多少空間可以反對。

暫無
暫無

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

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