Ответы пользователя по тегу Тестирование ПО
  • В чём смысл писать функциональные тесты на Java, если есть postman и другие инструменты?

    AnotherAnkor, Есть много историй с кафка или redis - где нам надо ходить и вариантов нет - и тут постман пролетает.
    Есть также всякие ui и скриншотные тесты, которые тоже надо писать и на постмане не сделать .
    А есть достаточно более сложные тесты где нам надо не только отправлять запросы, но слушать websoket, sse и не факт что только под одним пользователем.
    Плюс есть всякие штуки на создание и прочее, которые тоже простыми не бывают. И нам приходится использовать разные паттерны разработки.
    Да и много чего еще чего есть. Что если и можно сделать через постман - то это дорого и больно сложно.

    Но это не значит что постман плохой инструмент - это лиш значит, что он хорошо себя показывает в конкретных кейсах, на конкретных проектах.

    Если вы тестите простые веб-сервисы с простой логикой, то да отличный инструмент для автоматизации. И возможно что-то другое избыточно
    Ответ написан
    1 комментарий
  • Как в 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
    Ответ написан
    Комментировать
  • В чём разница между е2е и Unit тестами?

    Ну технически могут, кто ж вам запретит то.
    Но тут надо делать различие больше не технологическое, а бизнесовое.
    юнитов - много их запускают перед сборкой/выкаткой приложения, так как они замоканы, проходят быстро и стабильные, ну и они больше технические, нежели бизнесовые
    е2е - это уже больше про бизнес-кейсы. Их должно быть мало. Они завязаны на сторонние сервисы, незамоканы и следовательно не стабильны. и запускают их уже в рамках больше регресса. И логично их держать где-то в одном месте, что бы когда их опять придется чинить и править, не искать их черти где.
    Ответ написан
  • Набор ЯП для автотестирования?

    Дело вкуса конечно, я автоматизировал и на питоне и на джаве, и на питоне.
    Но на питоне мне автоматизировать больше нравится, ну у плюс в питоне много всякого сахара, который сильно упрощает написание тестов и делает их более лаконичными.
    Ответ написан
    2 комментария
  • Как запустить тесты в Pytest из списка?

    как угодно собираешь список упавших тестов, хоть из прогона хоть отчет распарсить.
    Можно заюзать хуку pytest_terminal_summary и в ней пройтись по упавшим тестам и выгрузить куда-нибудь, можешь любую другую в целом не так важно.

    Берешь хук pytest_collection_modifyitems и в ней фильтруешь список для запуска исключая все тесты которых нет в списке упавших тестов.
    Ответ написан
    Комментировать
  • Какой ЯП лучше изучать для автоматизации тестирования?

    Как отметили выше автоматизация разная:
    Если хотите автоматизировать мобилки то там swift и kotlin
    Для браузерной автоматизации: лучше js и какой-нибудь cypress - что бы по максимуму и однородно закрыть автоматизацию как с моками так и без них
    Если там апи автоматизация - то я бы взял Python - инструменты позволяют делать много и достаточно дешево по времени разработки, так же на нем и браузерную автоматизацию можно
    Для перфоманс тестинга: я использую scala и gatling - ну тут можно в разные стороны смотреть.
    Ответ написан
    Комментировать
  • Какое приложение выбрать для тестирования API?

    Если мне крайне редко надо дернуть пару ручек для тестирования апи есть курл, мне его вполне достаточно.
    Но если мы говорим уже о каких тестах со сценариями регулярным запуском и шарингом, то я использую python + pytest + request(aiohttp) + allure - и пишу уже нормальные автотесты, которые потом можно поддерживать и расширять.
    Ответ написан
    Комментировать
  • Какие вопросы на собеседовании QA Manual Trainee?

    Я прошел много собеседований, не QA Manual, но эт не так важно.
    Есть адекватные собеседования на которых реально пытаются понять твои компетенции, а есть какая-то хрень. где люди не знают или не понимают как собеседовать и кто им нужен, и там могут спросить все что угодно.
    Лучше походить по реальным собеседованиям, чем готовится к некому мифическому.
    Ответ написан
    2 комментария
  • Как построить архитектуру для автотестов?

    Я насколько это возможно покажу как подхожу я к автотестам на АПИ.
    У нас есть пулл АПИшек и пулл Авторизаций для них, каждый из них это отдельный микросервис, написанный на разных языках 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 комментариев
  • Работа тестировщиком не дает никаких полезных навыков в плане дальнейшего трудоустройства разрабочиком?

    Я занимаюсь автотестированием примерно 4 года.
    Примерно 70% своего рабочего времени я писал код какой-никакой.
    Условно 30% времени лично у меня это было написания автотестов и вроде код и такой себе.
    Еще 30% было достаточно простой код для того что было удобнее писать автотесты.
    Все остальное время сложно оценить, были и не сильно сложные вещи были и посложнее.
    Фреймоворки во основном весьма специфичны, и мало полезны для условно бэк разработки. Но это смотря где работать, в некоторых местах надо писать достаточно качественный код, с весьма хорошей нагрузкой и соответственно оптимизацией.
    Ответ написан
    Комментировать
  • Стоит ли создавать автотесты для мобильной версии сайта?

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

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

    Полный 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 - список всех окон
    Ответ написан
  • Какой самый распространенный стек для автоматизированного тестирования на python?

    pytest или behave + selenium также возможно брать элементы по xpath, css и так далее.
    Ответ написан
    Комментировать