0

これがどこか明確でない場合 (または用語が正しくない場合) は申し訳ありませんが、最善を尽くします!

実際にフォーラムに投稿するのは初めて;) ...

知識のある方からの助けをいただければ幸いです。

Python バインディングで Selenium を使用して、多数のプラットフォーム (OS) とブラウザーで Web ベースのアプリケーションの自動テストを実施しています。

この一環として、HTMLTestRunner モジュールを使用して、各テスト実行の最後にレポートを生成しています。私の問題はここにあります。

現在読み取っている私のコードの結果は、それぞれのリスト内のプラットフォーム/ブラウザーの組み合わせごとに、HTMLTestRunner モジュールが初期化され、単一のテスト ケースを実行し、レポートを生成して閉じます。

HTMLTestRunner は初期化され、すべてのテスト ケースを実行し、すべてのテスト結果を使用して 1 つのレポートを作成するように設計されているため、これにより、生成されたレポートがそれ自体を上書きするという問題が発生します (またはフォーマットの問題につながります)。

ちなみに、HTMLTestRunner の代わりに「unittest.TextTestRunner()」を使用すると、本質的に同じことが起こり、結果のみが明らかにシェルに表示されます。1 つのテストを実行しました... OK... 1 つのテストを実行しました... OK... et

「unittest.main(exit=False)」という行を使用してみましたが、これはシェル内で表示される結果に対して実際に機能しているように見えます。たとえば、レポートが提供される前にすべてのテストが実行されます。

残念ながら、HTMLTestRunner でこの機能を使用する方法が見つかりませんでした。

(誰かが、このように実行コード行をループする代わりに、メタ クラスを使用してテストを動的に生成することで戻ってくるのではないかと思います。これを調べている間、これを実装する方法と多くの開発者タイプが、これは避けなければならないことだと言っています (ここで議論を始めたくない!)。

とにかく、私が使用しているコードの簡単な例は次のとおりです。

global platform_list

platform_list = ['XP','VISTA','LINUX','WIN8','MAC']

global browser_list

browser_list = ['internet explorer','firefox','chrome','safari','opera']

class configuration(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Remote(command_executor= executor, desired_capabilities={'platform': platform, 'browserName': browser})
        self.driver.implicitly_wait(30)
        self.base_url = environment
        self.verificationErrors = []
        self.accept_next_alert = True

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException, e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException, e: return False
        return True

    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

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

class test_case_A(configuration):
    def test_case_A(self):
        try:
            some code
        except:
            some code

class test_case_B(test_case_A):
    def test_case_B(self):
        self.test_case_A()
        try:
            some code
        except:
            some code

unit_test_suite = unittest.TestSuite()
unit_test_suite.addTest(test_case_A('test_case_A')), (test_case_B('test_case_B'))

results = file('results.html', 'wb')

runner = HTMLTestRunner.HTMLTestRunner(stream = results, title = 'Whatever', description = 'Whatever')

global platform
global browser

for platform in platform_list:
    for browser in browser_list:
        unittest.TextTestRunner().run(unit_test_suite)

上記のコードの特定の要素は、グローバル宣言など不要かもしれませんが、実際には必要であると述べたいだけです!

どんな助けでも大歓迎です!どうもありがとう...

4

1 に答える 1

1

私が理解できる限り、コードの大幅な再構築が必要になる可能性があるため、この回答が役立つかどうかはわかりません。

回帰スイートを実行するために、回帰スイートを構築してから を実行する特定のモジュールがありHTMLtestrunnerます。

したがって、複数のテスト ケースを含む各テスト モジュールがインポートされ、TestSuite に追加されてから、スイート自体が起動されます。

切り詰めた例を次に示します。

from unittest import TestLoader, TestSuite
import HTMLTestRunner
import datetime
from root.nested.tests.test_class_1 import TestClass1
from root.nested.tests.test_class_2 import TestClass2

class RegressionSuite():

if __name__ == "__main__":

    file_name = datetime.datetime.now().strftime("%Y_%m_%d_%H%M_report.html")

    output = open(file_name, "wb")

    loader = TestLoader()
    suite = TestSuite((
                       loader.loadTestsFromTestCase(TestClass1),
                       loader.loadTestsFromTestCase(TestClass2)
                      ))
    runner = HTMLTestRunner(stream = output, verbosity = 1, title="Regression Suite")
    runner.run(suite)

このモジュールが実行されると、生成される HTML 結果ファイルに各テスト クラスの概要が一覧表示され、詳細を表示して各テスト ケースの結果を表示することもできます。

于 2013-11-12T10:01:52.237 に答える