2017-09-29 1 views
0

私はPython Seleniumを使い始めて、以下に示すスクリプトを書いています。繰り返しグローバル変数とし、Python単体テスト以外で試してみよう

これは、失敗したテスト(test01、test02、test03、..)にリンクされたリターンコードを出力します。

各テストで同じことがチェックされているのを無視します。

私は、それぞれがglobal resを繰り返し宣言し、次にtry/exceptというブロックを持っているので、よりクリーンな方法でテストを書くかどうかを理解しようとしています。

誰でもこの改善方法に関するアドバイスをいただけますか?

# global variable for return code. Zero is success. 
res=0 

@atexit.register 
def send_health(): 
    print ("res=%s") % res 

class Login(unittest2.TestCase): 
    @classmethod 
    def setUpClass(inst): 
     binary = FirefoxBinary('C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe') 
     inst.driver = webdriver.Firefox(firefox_binary=binary) 
     inst.base_url = "https://stackoverflow.com" 

    def test01(self): 
     global res 
     driver = self.driver 
     try: 
      self.assertEqual("Ask a Question", driver.title) 
     except Exception,e: 
      print ("Exception: %s" % e) 
      driver.save_screenshot('screenshot_test01.png') 
      res=1 
      return 

    def test02(self): 
     global res 
     driver = self.driver 
     try: 
      self.assertEqual("Ask a Question", driver.title) 
     except Exception,e: 
      print ("Exception: %s" % e) 
      driver.save_screenshot('screenshot_test02.png') 
      res=2 
      return 

    def test03(self): 
     global res 
     driver = self.driver 
     try: 
      self.assertEqual("Ask a Question", driver.title) 
     except Exception,e: 
      print ("Exception: %s" % e) 
      driver.save_screenshot('screenshot_test03.png') 
      res=3 
      return 

if __name__ == "__main__": 
    unittest2.main() 

答えて

0

上記のヒントをありがとう。私はコードをこのバージョンにまで縮小しましたが、これはうまくいけば清潔でより標準的です。

class Login(unittest2.TestCase): 

    @classmethod 
    def handleError(self, e, res): 
     print ("Test failed with exception: %s" % e) 
     self.result = res 
     sys.exit() 

    @classmethod 
    def setUpClass(self): 
     binary = FirefoxBinary('C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe') 
     self.driver = webdriver.Firefox(firefox_binary=binary) 
     self.base_url = "https://stackoverflow.com" 
     self.result = 0 

    def test01(self): 
     driver = self.driver 
     try: 
      self.assertEqual("Ask a Question", driver.title) 
     except Exception,e: 
      self.handleError(e, 1) 

    def test02(self): 
     driver = self.driver 
     try: 
      self.assertEqual("Ask a Question", driver.title) 
     except Exception,e: 
      self.handleError(e, 2) 

    def test03(self): 
     driver = self.driver 
     try: 
      self.assertEqual("Ask a Question", driver.title) 
     except Exception,e: 
      self.handleError(e, 3) 

    @classmethod 
    def tearDownClass(self): 
     self.driver.quit() 
     print ("res=%s") % self.result 

if __name__ == "__main__": 
    unittest2.main() 
4

ここではグローバル変数はまったく必要ありません。あなたはクラスの中にいます。全体を通してself.resを使用してください。

+0

ありがとうダニエル私はこれを試してみます。 – Edward

+0

'send_health'終了関数を呼び出すと壊れます ' print( "res =%s")%self.res' 'NameError:グローバル名 'self'が定義されていません。 – Edward

2

これはまさにsetUpインスタンスメソッドのためのもので、テストクラスごとに1回実行されるsetUpClassメソッドと非常によく似ています。

def setUp(self): 
    # this code will be executed before each and every test 
    self.res = 0 

def tearDown(self): 
    # this code will be executed post each and every test. 

ところで、なぜグローバル変数を使用していますか?それらの必要はありません。実際、グローバルを使用するための正当な根拠はほとんどありません。さらに、テストは独立して独立している必要があり、グローバル変数を使用するとそのルールに違反します。

+0

あなたの素早い返信をありがとう。私は 'setUpClass'と' tearDownClass'を使用しています。テストにはサイトにログインしてから、旅行をクリックする必要があるからです。 – Edward

+0

@Edward私は 'setUpClass'の使用に問題はありません。ただし、グローバルなres値は必要ありません。テストを分離する必要があるため、それらの間で値を共有することはお勧めできません。 – hspandher

関連する問題