簡體   English   中英

如何在Python中使用裝飾器跨平台/瀏覽器運行測試?

[英]How to run tests cross-platform/browser using decorator in Python?

我有一個測試套件,如下所示:

import unittest
from selenium import webdriver

SAUCE_USERNAME = 'xxx'
SAUCE_ACCESS_KEY = 'xxx'
sauce = SauceClient(SAUCE_USERNAME, SAUCE_ACCESS_KEY)

browsers = [{"platform": "Mac OS X 10.9",
         "browserName": "chrome",
         "version": "31"},
        {"platform": "Windows 8.1",
         "browserName": "internet explorer",
         "version": "11"}]


def on_platforms(platforms):
    def decorator(base_class):
        module = sys.modules[base_class.__module__].__dict__
        for i, platform in enumerate(platforms):
            d = dict(base_class.__dict__)
            d['desired_capabilities'] = platform
            name = "%s_%s" % (base_class.__name__, i + 1)
            module[name] = new.classobj(name, (base_class,), d)
    return decorator

@on_platforms(browsers)
class MyTestSuite(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.desired_capabilities['name'] = cls.id()
        sauce_url = "http://%s:%s@ondemand.saucelabs.com:80/wd/hub"
        cls.driver = webdriver.Remote(
        desired_capabilities=cls.desired_capabilities,
        command_executor=sauce_url % (SAUCE_USERNAME,SAUCE_ACCESS_KEY))
        cls.driver.implicitly_wait(30)

    def test_1from_sauce(self):
        pass

    def test_2from_sauce(self):
        pass

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

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

我的目標是為瀏覽器中的瀏覽器/平台運行test_1from_sauce和test_2from_sauce,而且我也想在setUpClass上設置的瀏覽器中連續執行這兩個操作。 為了進一步說明,我想打開瀏覽器並進行兩個測試,然后退出該驅動程序並啟動另一個驅動程序。

現在,當我運行此代碼時,出現以下錯誤:TypeError:必須使用SeleniumSauce_2實例作為第一個參數調用未綁定方法setUpClass()。

我知道應該在類和子類聲明中進行修改,但是我不知道應該做什么或應該更改什么部分。

編輯:我省略了以下行,它工作正常:

cls.desired_capabilities['name'] = cls.id()

您在問題中顯示的代碼缺少sysnew的導入。 其次,添加正確的導入后運行代碼時出現的錯誤不是您在問題中報告的內容,而是:

EE
======================================================================
ERROR: setUpClass (__main__.MyTestSuite_1)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 33, in setUpClass
    cls.desired_capabilities['name'] = cls.id()
TypeError: unbound method id() must be called with MyTestSuite_1 instance as first argument (got nothing instead)

我省略了第二個ERROR ,它與上面的相同,只是它是針對MyTestSuite_2而不是MyTestSuite_1 問題很明顯。 您調用了clsid()成員,但是id()是一個實例方法而不是類方法,因此它需要類的實例,而不是類本身。 我不確定最終想要什么,但是如果將其用於setUpClass ,則不再發生錯誤,並嘗試進行連接:

@classmethod
def setUpClass(cls):
    cls.desired_capabilities['name'] = cls.__name__
    sauce_url = "http://%s:%s@ondemand.saucelabs.com:80/wd/hub"
    cls.driver = webdriver.Remote(
        desired_capabilities=cls.desired_capabilities,
        command_executor=sauce_url % (SAUCE_USERNAME, SAUCE_ACCESS_KEY))
    cls.driver.implicitly_wait(30)

唯一的修改是方法的第一行。

順便說一句,我不明白為什么要使用new.classobj 一方面,不建議使用new模塊。 其次,使用內置type而不是new.classobj

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM