最近系統前端組件做了更新,我就把之前做的web自動化的代碼做了一些修改,順便優化了下用例,只保留少量的測試用例了,大頭還是在接口自動化上。然后發現關於pytest的還有一個點應該比較常用,這里再介紹一下。
相信有的同學在使用python的unittest框架做web自動化測試的時候會遇到一個問題,需要在setUp方法里去定義瀏覽器驅動,為了執行case之前打開瀏覽器。如果在執行很多case的時候呢,打開瀏覽器浪費的時間還是挺多的,當然了,你可以一個模塊打開一次瀏覽器,不過仍然不是我們最終想要的,執行全部測試,只需要打開一次瀏覽器,這才是我們想要的。
一、使用unittest的傳統方式
這里就是使用unittest框架,執行之前DemoCase類下的用例前打開瀏覽器。
class DemoCase(unittest.TestCase):
def setUp(self): #每個用例執行之前
print('before test')
self.driver = webdriver.Chrome()
def test_demo1(self):
xxxx
def test_demo2(self):
xxxx
def tearDown(self): #每個用例執行之前
self.driver.quit()
if __name__ == '__main__':
unittest.main()
二、使用pytest實現打開一次瀏覽器
這里要用到conftest.py跟fixture了,在之前的文章里已經講過。
還有一個點就是web自動化的原理,其實就是我們的代碼向被測試的瀏覽器發送了一個http請求,然后瀏覽器接受請求,執行相應操作,並在Response中返回執行狀態、返回值等信息。所以當你啟動一次瀏覽器的時候就是產生了一次session,下面來實現以下就好了。
原理也很簡單,在你case所在目錄的上層創建conftest.py文件,不放心的可以放在項目根目錄下。然后在conftest.py文件里定義一個全局的瀏覽器驅動,利用pytest的fixture特性,設置這個驅動的范圍在整個session里,幾行代碼就可以了。
#conftest.py
driver = None
@pytest.fixture(scope='session', autouse=True)
def browser():
global driver
if driver is None:
driver = webdriver.Chrome()#GUI界面運行
driver.maximize_window()
return driver #返回驅動
使用的時候,在需要啟動瀏覽器進行頁面操作的地方,傳入驅動就好了。比如下面的這個登錄操作
#test_demo.py
def test_login_failed(browser, username, password, res):
'''測試非法登錄'''
LP = LoginPage(browser)
error_msg = LP.login_failed_and_return_error_msg(username, password)
assert error_msg == res
這是建立在使用page object設計模式上的,對應的,LoginPage里用對應的方法封裝頁面操作。
是不是很簡單,趕快去試試吧,歡迎留言交流!