2014-01-14 32 views
0

我開始一個新的Python項目,它將通用GUI測試功能(外部開發的,例如Sikuli)包裝到應用程序特定的框架中。其目的是儘可能簡化應用程序的編寫測試腳本,包括報告測試結果和處理錯誤。避免Python中的非平凡或不可維護的GUI測試結構

有很多可能的方法,沒有一個看起來很理想,但是我對Python很新,所以可能會有一些簡單而有效的東西,我錯過了。基本上我試圖平衡清潔__init__.py文件,易於使用和可維護的結構。

舉個例子,我想劇本作家能夠寫出這樣的事:

import framework 
import framework.programs.program_f as curr_program 
import framework.pages.page_b.area_a as curr_area 

if __name__ == "__main__": 
    framework.log.start_section("Section 1") 

    curr_area.click_button(curr_area.buttons.BUTTON_D) 
    curr_program.wait_for_launch() 
    curr_program.test_is_running() 

    framework.log.end_section() 

所以,沒有必要爲他們創建一個對象實例(即使我可以使用的對象背景)。然而,這種佈局需要的對象實例在包中創建__init__.py文件,如:

|- framework 
| |- log.py 
| 
|- pages 
| |- page_a 
| | |- _areas.py (contains class AreaA(AreaBase): ...) 
| | |- dialogs 
| | | |- __init__.py 
| | |- __init__.py (contains area_a = _areas.AreaA()) 
| | 
| |- page_b 
| |- __init__.py 
| 
|- __init__.py 

另一種方法是提供測試作家班和依靠測試人員合理使用(例如,只創建一個實例)。然而,一個包爲每個頁面(保持特定的頁面文件良好的組織),並保持__init__.py慾望文件大部分是空的它很容易導致需要對這樣的代碼:

curr_page = framework.pages.page_a_pkg.page_a_mod.PageA() 
intro_page = framework.pages.intro.intro.Intro() 

,而不是我的原:

curr_page = framework.pages.page_a 
intro_page = framework.pages.intro 

由於深層嵌套和重複,第一個人會感到不和諧。第二個人覺得不太和諧,因爲我掩蓋了對象的使用。我看不到第三種方式,並認爲這可能是由於我對Python的經驗不足。

是否有任何調整或替代方案適合這個問題?甚至,我以錯誤的方式處理這個問題?

編輯補充:

第三種選擇是使用的結構,如:

framework 
| |- pages 
| | |- page_a_mod.py 
| | |- _page_a_pkg 
| | | |- page_a-specific stuff 
| | | |- __init__.py 

但是,剛剛轉page_a_mod.py到一個額外的__init__.py文件_page_a_pkg,但以不同的名稱。同樣的結果,只需移動甲板椅子一下。

回答

0

雖然我個人認爲讓人們至少達到對語言和框架API的基本熟悉程度是有價值的,這樣他們才能真正有效,您可以使用一個或多個context managers作爲一種設置狀態機,然後將它們放入一個已經創建好的對象的上下文中供他們使用。然後,他們可以這樣做:

with test_context('new_user', 'logged_in') as context: 

    context.current_area.click_button(.... 

雖然我建議你也看看使用合適的單元測試框架,像pyunitnose,來驅動你的測試場景。

+0

這是一個有趣的想法,但謝謝,但它沒有解決結構選項。 – user1472525