Windautotest是我開發的一個基於Web界面進行操作的測試用例自動化執行平臺。Windautotest使用python+django在nose+unittest的基礎上開發。相比於直接使用nose,使得測試執行更方便,測試結果更易於管理。
需求:
點擊job的Rerun Failed按鈕,生成一個新的job,運行當前job的失敗用例。對於Rerun Failed生成的job,仍然可以執行Rerun Failed操作。
思考:
nosetests --with-id運行時可以生成.noseids文件,之後使用nosetests --failed,則只執行上一次運行失敗的用例。
使用--with-id每次執行時都會生成id文件會覆蓋之前的id文件。
可以指定id文件的名字,這樣就可以每次都生成一個不同的id文件。Rerun Failed時,不指定案例目錄,而是指定id文件。例如:>nosetests --failed --id-file=bgp.noseids。爲了生成新的noseids文件了。可以>nosetests --failed --id-file=bgp.noseids --with-id,這種方式會從bgp.noseids提取出失敗的用例進行執行,並且將本輪執行失敗的用例信息寫入bgp.noseids。但是原來的bgp.noseids被覆蓋。這會導致執行過一次Rerun Failed的job,其Rerun Failed功能不正常。
設計:
每次執行任務時,將id信息寫入job_id.noseids文件。
View函數rerun_failed()將test_dierectory設置爲.noseids的完整路徑。將原job的job_id.noseids複製爲new_job_id.noseids。比如原job的id是1000,新job的id是1001,然後執行>nosetests --failed --id-file=1001.noseids --with-id --with-html --html-file=report_filename> log_file_name。
周邊配套實現:
models.py中模型Job中添加noseids字段,存儲noseids文件的路徑。noseids = models.CharField(max_length=4096,default=None,null=True)。Linux最大路徑長度是4096字節。
urls.py中urlpatterns中添加path('rerun_failed/<int:job_id>/', views.rerun_failed, name='rerun_failed'),。
Job_list.html添加Rerun Failed按鈕。
新的job的name爲rerun failed of job id號,名字不用再修改,所以不再彈出add_job頁面。
測試:
首先將add_job()和_run_job()進行修改,添加--with-id選項。功能正常。
實現rerun_failed()和_rerun_failed()。
Rerun Failed功能正常。而且Rerun Failed的job再次Rerun Failed,功能也正常。
缺陷:還沒有執行完的job,Rerun Failed會生成無法執行的job。
解決辦法:模板Job_list.html中,添加邏輯,如果狀態不是COMPLETE,則“Rerun Failed”只是文本,而不是超鏈接。
類似的,report按鈕也做這樣的優化。
侷限:不能對rerun failed的用例進行rerun。其實是可以實現的,但是我覺得沒有必要rerun這種job,我們只關心失敗的用例。
UI優化:讓rerun不能被點擊,爲此models中添加rerun_failed標記。添加rerun failed的job時,將標記置位。Job_list.html中,添加邏輯,如果rerun_failed標誌置位,則“rerun”只是簡單的文本,而不是超鏈接。