簡體   English   中英

如何為 wxWidgets 編寫 GUI 測試

[英]How to write GUI tests for wxWidgets

我想為我的 C++ wxWidgets 應用程序創建一個測試套件,但在弄清楚如何測試 GUI 組件時遇到了麻煩。 文檔中關於如何編寫單元測試的文章是從擴充現有單元測試的角度編寫的,但沒有說明如何開始新的單元測試。

我能夠使用Catch (這似乎是推薦的方法)創建一個測試套件,但在 GUI 端入門時遇到了麻煩。

在非 GUI 方面,我創建了一個如下所示的測試

#include "catch.hpp"

#include "wx/wx.h"

TEST_CASE("wx", "[wx]") {
    wxPoint p = wxPoint(10, 10);
    REQUIRE(p.x == 10);
}

和一個看起來像這樣的 CMakeLists 文件(只是相關部分):

set(CATCH_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/wxWidgets/3rdparty/catch/include/)
add_library(Catch INTERFACE)
target_include_directories(Catch INTERFACE ${CATCH_INCLUDE_DIR})

# Make test executable
set(TEST_SOURCES 
    test.cpp
)
add_executable(tests ${TEST_SOURCES})
target_link_libraries(tests Catch ${wxWidgets_LIBRARIES})

這工作得很好。 所以鏈接 wxWidgets 庫沒有問題。 我相信問題在於創建 wxApp 或事件循環。 但我不確定如何糾正。

當我創建一個嘗試創建按鈕的測試時(例如在buttontest.cpp中建議用作示例的buttontest.cpp中),我收到一個Segmentation violation signal buttontest.cpp Segmentation violation signal

TEST_CASE("wx", "[wx]") {
    wxButton* button = new wxButton(wxTheApp->GetTopWindow(), wxID_ANY, "wxButton");
    wxYield();
}

有沒有地方可以演示如何從頭開始為 wxWidgets 創建 GUI 測試,而不僅僅是添加到 wxWidgets 測試本身?

請不要為 GUI 連接單元測試,這完全違反了Clean Code的規則。 有幾個原因:

  1. 各種 GUI 框架(包括)wxWidgets 中的大多數方法都是私有的(這是正確的)。 干凈代碼的規則說我們不應該為私有方法編寫單元測試——它們只是實現細節。
  2. 開發GUI應用程序需要分離視圖(GUI)邏輯和業務(例如:數據庫訪問)邏輯。 最好的方法是使用MVVM設計模式。

另外,我會推薦一本好書: Clean Code 它是關於清潔代碼的書。 它還涉及TDD - 測試驅動開發- 這也是與您的問題密切相關的重要主題。

不幸的是,編寫 GUI 測試不是很簡單,但可以做到。 基本思想是你使用wxUIActionSimulator來觸發你想要測試的用戶動作,然后檢查 UI 是否已經按預期更新,這通常涉及調用wxYield()來處理所有事件。 wxWidgets 自己的 GUI 測試本身展示了如何做到這一點,但通常還有一些額外的復雜性,只需搜索wxUIActionSimulatortests即可查看其使用的許多示例。

您還可以查看此測試以查看如何使用wxTEST_DIALOG測試導致模態對話框的操作的示例,該操作通常會阻止 GUI 並阻止您的程序繼續。

暫無
暫無

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

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