2011-04-01 48 views
15

我們的Python應用程序(一個很酷的web服務)有一整套測試(單元測試,集成測試等),所有開發人員在提交代碼之前都必須運行。
我想添加一些性能測試到套件,以確保沒有人添加使我們運行速度太慢的代碼(對於一些相當任意的慢速定義)。
顯然,我可以收集一些功能到測試中,計時並與某個預定義的閾值進行比較。在Python中自動測試性能的正確方法(適用於所有開發人員)?

棘手的要求:

  1. 我希望每一個開發人員能夠測試自己的機器上的代碼(與CPU功率變化,OS(Linux和某些Windows)和外部配置 - 的Python版本,庫和模塊是相同的)。測試服務器雖然通常是個好主意,但並不能解決這個問題。
  2. 我想測試爲DETERMINISTIC - 無論運行測試的機器上發生了什麼,我都希望多次測試運行返回相同的結果。

我的初步想法:

  • 使用timeit並做系統的基準我每次運行測試時間。將性能測試結果與基準進行比較。
  • 使用cProfile來使解釋器無視「外部噪音」。我不確定我知道如何閱讀pstats結構,但我相信它是可行的。

其他想法?

謝謝!

Tal。

回答

5

退房funkload - 這是一種將單元測試運行爲功能或負載測試的方式,以衡量您的網站的性能。

另一個可以與funkload結合使用的有趣項目是codespeed。這是一個內部儀表板,用於衡量代碼每次提交時代碼的「速度」,並呈現隨時間推移的趨勢圖。這假定你有許多可以運行的自動基準 - 但它可能是一個有用的方法,可以隨時間對性能進行權威性記錄。到目前爲止,我所見過的codepeed的最佳使用是speed.pypy.org網站。

至於您對決定論的要求 - 也許最好的方法是使用統計數據來獲得您的優勢?自動運行測試N次,產生所有運行的最小值,最大值,平均值和標準偏差?看看這個article on benchmarking的一些指針。

+0

我希望他們叫它* codspeed *。 – 2016-04-18 14:30:04

1

我想測試是確定的 - 不管發生了什麼機器上運行的測試,我想測試的多次運行到返回相同的結果。

失敗。根據定義或多或少,這在具有多個用戶的多處理系統中是完全不可能的。

要麼重新考慮這個要求,要麼找到一個運行不涉及任何現代多處理操作系統的測試的新環境。此外,您的運行Web應用程序不是確定性的,因此施加某種「確定性」性能測試沒有多大幫助。當我們做了時間關鍵處理(在雷達中,「實時」實際上意味着實際時間),我們沒有嘗試確定性測試。我們做了代碼檢查,並運行簡單的性能測試,涉及簡單的平均值和最大值。

使用CPROFILE儀器解釋忽視「外界噪音」。我不確定我是否知道如何閱讀pstats結構,但我相信它是可行的。

Stats由探查器創建的對象就是您要尋找的對象。

http://docs.python.org/library/profile.html#the-stats-class

關注「pcalls」,原始的調用次數,在配置文件中的統計數據,你就會有東西是約確定性。

+0

對於我的系統,'pcalls'是非常確定的。我有一個測試來檢測'pcalls'是否發生了變化,並且報告了百分比。然後,測試失敗可能成爲調查發生了什麼變化以及性能影響是否可以接受的跳板點。 – 2016-04-18 14:27:56

相關問題