Python+Selenium自動化テスト--テストキットの構築


今日は、テストキットの構築方法について説明します.
一括実行スクリプト
テストキットの構築
完全なユニットテストは1つのテスト例のみを実行することはめったにありません.開発者は通常、あるソフトウェア機能を比較的完全にテストするために複数のテスト例を作成する必要があります.これらの関連するテスト例は、unittestではTestSuiteクラスで表されるテスト例セットと呼ばれます.
testbaidu 1を作成したとします.py,testbaidu2.py 2つのファイルですが、私たちはどのようにしてこの2つのファイルを同時に実行しますか?
testbaidu1.py
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Baidu1(unittest.TestCase):
#test fixture,     
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
 
 #    ,   test    
 
    def test_baidusearch(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").click()
        driver.find_element_by_id("kw").clear()
        driver.find_element_by_id("kw").send_keys(u"  ")
        driver.find_element_by_id("su").click()
        driver.find_element_by_id("su").click()
      
    def test_hao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text("hao123").click()
        self.assertEqual(u"hao123_       ", driver.title)
 #  element    ,      
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
 #  alert    ,         
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
 #  alert,        
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
 #test fixture,       
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
#    
    unittest.main()

testbaidu2.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Baidu2(unittest.TestCase):
#test fixture,     
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
 
 #    ,   test    
 
    def test_baidusearch(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").click()
        driver.find_element_by_id("kw").clear()
        driver.find_element_by_id("kw").send_keys(u"selenium")
        driver.find_element_by_id("su").click()
        driver.find_element_by_id("su").click()
      
 #  element    ,      
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
 #  alert    ,         
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
 #  alert,        
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
 #test fixture,       
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
#    
    unittest.main()

addTest()の応用
複数または数百のテストケースがある場合、テストケース(テストケース)が必要となり、テストケースをその容器に入れて実行し、unittestモジュールにTestSuiteクラスを提供してテストケースを生成し、このクラスの構築関数を使用してテストケースのインスタンスを生成することができます.このクラスはaddTestを提供して、各テスト例をテストキットに追加します.
testbaidu 1.py、testbaidu2.py、runall.py同じディレクトリtestcaseに配置
runall.py
# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
#  testbaidu1,testbaidu2
import testbaidu1
import testbaidu2


#         ,
def createsuite():
     suite = unittest.TestSuite()
     #            (  ) 
     suite.addTest(testbaidu1.Baidu1("test_baidusearch"))
     suite.addTest(testbaidu1.Baidu1("test_hao"))
     suite.addTest(testbaidu2.Baidu2("test_baidusearch"))
     return suite
     
if __name__=="__main__":
     suite=createsuite()
     runner = unittest.TextTestRunner(verbosity=2)
     runner.run(suite)

上記のやり方には2つの面があり、スクリプトの迅速な実行を阻害し、runallを毎回修正しなければならない.py:
1)import testbaidu 1など、すべてのpyファイルをインポートする必要があります.新規作成ごとにインポートする必要があります.
2)addTestはすべてのtestcaseを追加する必要があり、1つのpyファイルに10個のcaseがある場合、10回追加する必要がある
makeSuite()とTestLoader()の応用
unittestフレームワークにはmakeSuite()の方法が提供されており、makeSuiteはテスト用例クラス内のすべてのテストcaseからなるテストキットTestSuiteを実現し、unittestがmakeSuiteを呼び出す際に、テストクラス名を入力するだけでよい.
TestLoaderはクラスとモジュールのテストキットを作成するために使用され、一般的にはTestLoader()を使用する.loadTestsFromTestCase(TestClass)は、テストクラスをロードします.
runall.py
# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
import testbaidu1
import testbaidu2

#         ,
def createsuite():

     suite = unittest.TestSuite()
     #            (  ) 
     suite.addTest(unittest.makeSuite(testbaidu1.Baidu1))
     suite.addTest(unittest.makeSuite(testbaidu2.Baidu2))
     return suite
     '''
     suite1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1) 
     suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2) 
     suite = unittest.TestSuite([suite1, suite2])
     return suite
     '''
     
if __name__=="__main__":
     suite=createsuite()
     runner = unittest.TextTestRunner(verbosity=2)
     runner.run(suite)

makeSuite()とTestLoader()の導入により、pyファイルテストクラスを1つ必要とせず、1回だけインポートすることができます.
では、クラスをテストしても毎回指定を追加しなくてもいいですか?
discover()の応用
discoverは、指定されたディレクトリからそのサブディレクトリに再帰的に移動し、すべてのテストモジュールを見つけ、それらのオブジェクトを含むTestSuiteを返し、パターンに一致する一意のテストファイルをロードします.discoverパラメータはそれぞれdiscover(dir,pattern,top_level_dir=None)です.
runall.py
# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time

#         ,
def createsuite():
     discover=unittest.defaultTestLoader.discover('../testcase',pattern='test*.py',top_level_dir=None)
     print discover
     return discover
     
if __name__=="__main__":
     suite=createsuite()
     runner = unittest.TextTestRunner(verbosity=2)
     runner.run(suite)

使用例の実行順序
unittestフレームワークのデフォルトロード試験例の順序はASCIIコードの順序に従い、数字とアルファベットの順序は:09,AZ,a~zである.
したがって、TestAddクラスはTestBddクラスよりも優先的に発見され、test_aaa()メソッドはtest_より優先されますccc()が実行される.テストディレクトリとテストファイルの場合、unittestフレームワークは同様にこのルールに従ってテスト例をロードします.
addTest()メソッドは増加順に実行される.
使用例の実行を無視
@unittest.skip(u'The function was canceled, neglects to perform thecase')
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Baidu1(unittest.TestCase):
#test fixture,     
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://www.baidu.com/"
        self.verificationErrors = []
        self.accept_next_alert = True

    @unittest.skip("skipping")
    def test_baidusearch(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_id("kw").click()
        driver.find_element_by_id("kw").clear()
        driver.find_element_by_id("kw").send_keys(u"  ")
        driver.find_element_by_id("su").click()
        driver.find_element_by_id("su").click()
      
    def test_hao(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        driver.find_element_by_link_text("hao123").click()
        self.assertEqual(u"hao123_       ", driver.title)
 #  element    ,      
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
 #  alert    ,         
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
 #  alert,        
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
 #test fixture,       
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
#    
    unittest.main()