Ошибка атрибута модульного теста при импорте модуля и его использовании

1

Ниже приводится мой каталог для автоматизации, который содержит три файла. Я пытаюсь запустить unittest файл test_page.py, импортировав Base.py. Base.py содержит настройки браузера и сбрасывает его, он принимает аргументы пользователя (браузер, имя пользователя и пароль) и регистрируется на сайте. Но когда я запускаю test_page.py, я получаю некоторые ошибки. Проблема в том, что мне нужно получить экземпляр браузера из Base.py, который я не могу. Я попытался присвоить браузеру() браузеру переменной, но открывает новый экземпляр. Мне нужно использовать тот же экземпляр браузера, который использует Base.py.

    Automation
       __init__.py
         Base.py
         test_page.py

Base.py

        import sys
        import argparse
        from selenium import webdriver
        import datetime

        parser = argparse.ArgumentParser()
        parser.add_argument('browser', default='chrome', help='Types of browser:chrome, firefox, ie')
        parser.add_argument('username', help='This is the  username')
        parser.add_argument('password', help='This is the  password')
        args = parser.parse_args()

        setup_parameters = sys.argv[1:]


        class Browser(object):

            url = 'https:someurl'
            start_time = datetime.datetime.today()


            def __init__(self):
                self.username = setup_parameters[1]
                self.password = setup_parameters[2]
                if setup_parameters[0] == 'chrome':
                    self.browser = webdriver.Chrome('C:\Python37\chromedriver.exe')
                    print("Running tests on Chrome browser on %s" % self.start_time)


                elif setup_parameters[0] == 'ie':
                    self.browser = webdriver.Ie()
                    print("Running tests on Internet Explorer browser on %s" % self.start_time)


                elif setup_parameters[0] == 'firefox':
                    self.browser = webdriver.Firefox()
                    print("Running tests on Firefox browser on %s" % self.start_time)


                elif setup_parameters[0] == 'None':
                    print('No browser type specified.... continuing with the default browser')
                    self.browser = webdriver.Chrome()

            def login(self):
                # Method used to log in to the site
                self.browser.get(self.url)
                self.browser.implicitly_wait(10)
                self.browser.maximize_window()
                self.browser.find_element_by_id("Username").send_keys(self.username)
                self.browser.find_element_by_id("Password").send_keys(self.password)
                self.browser.find_element_by_id("btnLogin").click()

            def close(self):
                # Closing the browser window and terminating the test
                self.browser.close()
                print("Test(s) ended on {} at {}".format(setup_parameters[0], datetime.datetime.today()))


        if __name__ == '__main__':
            Browser().login()
            Browser().close()

test_page.py

    from unittest import TestSuite
    from unittest import TestCase
    from selenium import webdriver
    import time
    import sys
    import Base
    from Base import Browser

    class TestHomePage(unittest.TestCase):

        def setUp(self):
            self.driver = Browser().browser
            self.login = Browser().login()

        def test_links(self):
            self.driver.find_elements_by_link_text('click this link').click()

        def tearDown(self):
            self.close = Browser().close()


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

    When I run test_page.py, I get the following error

    C:\Users\Projects\PortalAutomation>python test_page.py chrome username password

    EEE
    ======================================================================
    ERROR: chrome (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    AttributeError: module '__main__' has no attribute 'chrome'

    ======================================================================
    ERROR: 1EADMIN (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    AttributeError: module '__main__' has no attribute 'username'

    ======================================================================
    ERROR: password1 (unittest.loader._FailedTest)
    ----------------------------------------------------------------------
    AttributeError: module '__main__' has no attribute 'password'

    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s

    FAILED (errors=3)
Теги:
unit-testing

1 ответ

2

Вы вызываете argparse в файле Base.py Не делай этого. Переместите эти строки в другой файл или заверните их, if __name__ == __main__:

if __name__ == __main__
    parser = argparse.ArgumentParser()
    parser.add_argument('browser', default='chrome', help='Types of browser:chrome, firefox, ie')
    parser.add_argument('username', help='This is the  username')
    parser.add_argument('password', help='This is the  password')
    args = parser.parse_args()

Если вы не поместите эти строки в другой файл или внутри if __name__ == "__main__", этот раздел кода будет запущен при импорте, а не при вызове test_page.py из командной строки.

Вы также не хотите использовать argparse в сочетании с unittest. Test Base.py с помощью unittest и настройте аргументы, которые могут понадобиться для класса в setUp. Я рекомендую вам ввести username и password в конструктор вашего объекта Browser чтобы вы могли легко написать тест, в котором используется консервированное имя пользователя /pw. Вы можете сделать это так:

class Browser(object):

    url = 'https:someurl'
    start_time = datetime.datetime.today()

    def __init__(self, driver, username, password):
        self.driver = driver
        self.username = username
        self.password = password
        if self.driver == 'chrome':
        ...

то вы можете написать тест следующим образом:

def setUp(self):
    browser_obj = Browser('chrome', 'some_username', 'some_password')
    self.driver = browser_obj.browser
    self.login = browser_obj.login()

def test_links(self):
    self.driver.find_elements_by_link_text('click this link').click()

def tearDown(self):
    browser_obj.close()

а затем вызовите ваш unit тест с помощью простого python test_page.py (никаких аргументов не требуется).

Когда вы запускаете prod, вы можете вызвать Base.py с аргументами, например Base.py chrome username password. Обычно люди не проверяют свою логику argparse слишком тщательно, если вообще: поскольку именно квантовая физика не передает аргументы существующим классам/функциям.

Обратите внимание, что ваш первоначальный тест создает несколько объектов браузера вместо того, чтобы использовать один и тот же. Вы, вероятно, этого не хотите.

  • 0
    Спасибо @Matt Messersmith. Я попробую твой подход. Но причина, по которой я использую argparse, заключается в том, что мне нужно протестировать сайт на разных браузерах. Имя пользователя и пароль также различаются в зависимости от типа доступа, который имеет пользователь.
  • 0
    @DevBin Да, вам нужны различные браузеры, а также имя пользователя и пароль. Но вы все равно должны передавать их в класс Browser , независимо от того, как вы передаете аргументы в ваш основной скрипт. Это позволит вам эффективно тестировать класс Browser изолированно, не беспокоясь о «основном» методе и о том, как вы извлекаете аргументы из командной строки. Этот тип тестируемости также обеспечит лучшую локальность вашей программы (т.е. вы можете рассуждать о решениях локально, а не глобально)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню