Ответы пользователя по тегу Автоматизация
  • Как в Pytest создать паратремизованный тест с использованием разных параметров?

    у вас какая-то каша в коде:

    expected_response_text=[]
    for i in UA:
    expected_response_text.append(i)
    expected_response_text = {'user_agent': 'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30','platform': 'Mobile', 'browser': 'No', 'device': 'Android'}
    - вот тут вы идете по словарю, добавляете ключ в лист expected_response_text, потом в него же переприсваете словарь харкодный - что тут по вашему должно произойти?

    Ну и словари на прямую сравнивать бессмыслено надо всегда искать diff

    @pytest.mark.parametrize('agent, platform, browser, device', UA)
        def test_get_user_agent(self, agent, platform, browser, device):
            url = "https://playground.learnqa.ru/ajax/api/user_agent_check"
            UA = {"user-agent": agent}
    
            response = requests.get(url, headers=UA)
            parsed_response = response.json()
            expected_response_text = {
                'user_agent': agent,
                'platform': platform,
                'browser': browser,
                'device': device
            }
            print(expected_response_text)
            actual_response_text = parsed_response
            print(actual_response_text)
            assert not (result := compare(expected_response_text, actual_response_text)), result
    Ответ написан
    Комментировать
  • Как построить архитектуру для автотестов?

    Я насколько это возможно покажу как подхожу я к автотестам на АПИ.
    У нас есть пулл АПИшек и пулл Авторизаций для них, каждый из них это отдельный микросервис, написанный на разных языках python, jawa, go, в целом это не так важно. Есть документация по ним значит как формировать и отправлять и получать запросики понятно.

    # Условно у меня есть одна абстрация для всех классов, куда я сложил какие-то базовые вещи для всех.
    
    @dataclass
    class ApiAbstraction(ABC):
        config: Any = field(init=True) 
        session: ClientSession = field(init=True, default_factory=ClientSession)
    
        async def close(self):
            await self.session.close()
    
    # И есть разные классы, для авторизации и апи
    @dataclass
    class ApiBLABLA(ApiAbstraction):
        # Загрузить файл
        async def send_file(self, filepath: str):
            endpoint = f"app/files"
            new_url = urljoin(self.config.api, endpoint)
            headers = {"accept": JSON}
            file = os.path.abspath(filepath)
            data = {"file": open(file, "r")}
            raw_result = await self.session.post(new_url, headers=headers, data=data)
            result = await raw_result.json()
            response = get_response_instance(result)
            if response.success:
                file = FileUploadModel.init_from_data(response.result)
                return file
            return response
    
    # Условно класс для авторизации
    @dataclass
    class Auth(ApiAbstraction):
        async def login(self):
            endpoint = "auth/blabla"
            new_url = urljoin(self.config.auth, endpoint)
            headers = {}
            raw_response = await self.session.get(new_url, headers=headers)
            content = await raw_response.json(content_type=None)
            response = get_response_instance(content, AuthModel)
            return response
     
    # Для ответов у меня есть модели, в которые конвертируется JSON ответ. можно и напрямую работать, но нам захотелось через модели. 
    
    @dataclass
    class AuthModel(AbstractClass):
        key: str = ''


    И есть фикстуры которые мерджат нужные способы авторизации и апишки.
    Соответственно в тестах я получаю уже готовые объект для работы с апишкой.
    Для каких-то тестов, я сделал еще одну обертку для апишек, которая уже делает какие-то конкретные действия с разными апишками и выдает готовый результат.

    В целом почти все тоже самое что и с UI тестами.
    Ответ написан
    5 комментариев
  • Как запустить тесты Pytest параллельно по категориям?

    Вот серьезно нет в офф документации?
    xdist
    --dist=loadscope: tests will be grouped by module for test functions and by class for test methods, then each group will be sent to an available worker, guaranteeing that all tests in a group run in the same process. This can be useful if you have expensive module-level or class-level fixtures. Currently the groupings can’t be customized, with grouping by class takes priority over grouping by module. This feature was added in version 1.19.
    --dist=loadfile: tests will be grouped by file name, and then will be sent to an available worker, guaranteeing that all tests in a group run in the same worker. This feature was added in version 1.21.
    Ответ написан
  • Стоит ли создавать автотесты для мобильной версии сайта?

    Если автотесты написаны адекватно и в логики работы сервиса не происходит черная магия, когда пользователь входит с разных браузером или с мобилок.
    То запускать тесты на разных браузерах и банально эмуляторе мобилки, не сложно и делается быстро и просто.
    Насколько я помню есть нюансы при работе с календарем на мобилках.
    Ответ написан
    Комментировать
  • На основе чего выбирается язык программирования для автотестирования?

    Можно, селениум плюс минус везде одинаково работает.
    Ответ написан
    Комментировать
  • Не кликает по элементу, как решить?

    Полный stacktrace был бы полезен, но Гадание на черствых пряников, подсказывает что проблема в строчке
    return element.click()

    И судя по ошибке, элемента или уже нет на странице или он обновился.
    сделайте скриншот с драйвера, на момент ошибки, и увидете есть он или нет.
    уберите все не нужные слипы.
    Ответ написан
    1 комментарий
  • Как использовать wait вместо sleep?

    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    
    
    def get_element(self, path_type, element_path, custom_time_out=None,):
        """
        :param path_type: тип локатора
        :param element_path: путь элемента
        :return:
        """
        __type = {
            'xpath': By.XPATH,
            'css': By.CSS_SELECTOR,
            'id': By.ID,
            'class': By.CLASS_NAME
        }
        if custom_time_out is not None:
            time_out = custom_time_out
        else:
            time_out = self.time_out
    
        return WebDriverWait(self.driver, time_out).until(expected_conditions.presence_of_element_located((__type.get(path_type), element_path)))
    Ответ написан
  • Как с помощью selenium вернуться в предыдущее окно?

    driver.switch_to_window(id_windows) - переход на окно
    driver.window_handles - список всех окон
    Ответ написан