【selenium】python+selenium+unittest、1つのテスト例を実行するたびにブラウザを閉じるなどの時間がかかる問題の解決策・続・装飾器について...

4143 ワード

上一篇の评论を见てunittest装饰器(修饰器とも呼ばれる)も似たような问题を解决できることを知って、阳阳はわざわざ@classmethod装饰器の使い方を勉强して、そして简単にunittest自身の装饰器を绍介します;
「上海-悠悠」のブログに感謝し、Selenium 2+python自動化55-unittestの装飾器(@classmethod)
陽陽虚心学習の結果、コードの再設計は以下の通りである.
 1     @classmethod
 2     def setUpClass(cls):
 3         cls.driver = webdriver.Firefox()
 4         cls.driver.implicitly_wait(30)
 5         cls.base_url = "http://xxx.xxxx.com"
 6         cls.verificationErrors = []
 7         cls.accept_next_alert = True
 8 
 9     def test_1_login(self):
10         driver = self.driver
11         driver.get(self.base_url )
12         ...
13         #     
14         ...
15 
16     def test_2_update(self):
17         driver = self.driver
18         ...
19         #         
20         ...
21         
22     @classmethod
23     def tearDownClass(cls):
24         cls.driver.quit()

控訴コードの実行順序は、testcaseが実行されるたびにteardownClassが実行され、次のtestcaseが実行されるのではなく、上から下に実行されます.
これによりブラウザを終了して1回だけ実行すればよいので、teardownClassという関数は、個人情報を修正してログインに成功した状態に復元し、現在のテスト例の異常処理など、テスト例ごとに終了操作を行うことができない.
陽陽はtearDownClassを試した後、以下のコードを追加しました.
    def tearDown(self):
        self.driver.refresh()
        self.assertEqual( [], self.verificationErrors )

そしてやはりテストが終わるたびに成都は現在のページをリフレッシュし、そうすると、testcaseの使用例ごとに終了関数tearDownで終了し、最後にtearDownClassを実行してテストブラウザを閉じることができます.
 
説明が必要なのは、@classmethodはpython自体の装飾器なので、unit testフレームワークに属するassertEqualと断言しないでください.  
unittest自体にもアクセサリーが付いていますunittest.skip()は、testcaseをスキップするための装飾器で、以下のように使用されます.
      @unittest.skip(reason)、skip装飾器:装飾下のtestcaseを直接スキップし、reasonは原因を説明するために使用され、以下同じである.
      @unittest.skipIf(condition,reason),skipIf装飾器:condition条件がTrueの場合,装飾下のtestcaseをスキップし,skipのtestcase実行回数を計上する.
      @unittest.skipUnless(condition,reason)、skipUnlessデコレーション:condition条件がFalseの場合、デコレーションしたtestcaseをスキップし、skipのtestcase実行回数を計上します.
      @unittest.expectedFailure(),expectedFailureデコレーション:デコレーション下のtestcaseを実行し,実行に失敗するとそのtestcaseをスキップし,expected下で成敗したtestcase回数を計上する.
陽陽は@unittest.skipIfまたは@unittest.skipUnlessでも@classmethod装飾器の効果を実現できるはずですが、実現するのは相対的に面倒だと思います.
 
転載先:https://www.cnblogs.com/bainianfengri/p/7273501.html