• Чем делать в этой ситуации?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Я бы пошел верстальщиком на завод автозапчастей. Не нужно ставить себе сразу высокую планку, это всегда ведет к тому что вы завышаете ожидания к себе самому, и постоянно чувствуете неудовлетворение. Я думаю верстальщиком-эникейщиком можно будет сводить концы с концами, зато там вы будете возможно ценным кадром.
    Доучитесь, будет 2 года опыта работы, найдете себе работу по уровню. Вот и всё.

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

    lxsmkv
    @lxsmkv
    Test automation engineer
    Думаю ближе всего по принципу действия, элемент управления типа "регулятор громкости".
    KnobKnob или JogDial
    1689.jpg
    хотя пожалуй ближе к такому
    jQuery Knob
    только двигаться он будет у вас только в пределах 90 градусов.

    ...искал по запросам "Volume Control js" и "Knob control js"
    Ответ написан
    Комментировать
  • Какие сценарии использовать для тестирования платежной формы?

    lxsmkv
    @lxsmkv
    Test automation engineer
    если у вас нет спецификации, что будет т.н. оракулом? Т.е как вы определите это ошибка или так и надо. Например, вы ввели вместе с числами буквы, поле стерлось и не было показано никакого сообщения что ввод неверный. Это ошибка? А может так было задумано. Все что вы можете сделать это эксплоративное тестирование. Т.е впринципе вы можете протестировать только положительные сценарии, для негативных сценариев нет информации. Все что вы можете это предположить как оно должно работать.
    Так же вы ограничены в глубине тестирования. Чтобы сделать самые интересные тесты вам придется переводить деньги. Этого вы сделать не можете, и никто от вас этого потребовать не может.
    Но даже при отсутствии спецификации, можно конечно сделать сравнительное тестирование, задокументировать поведение системы на одном устройстве и посмотреть ведет ли себя система так же на другом.
    Составьте пользовательские сценарии. Подумайте какие цели ставит себе человек решивший воспользоваться таким сервисом, и может ли он достигнуть цели.
    Покопайтесь в компьютерных журналах, там часто проводят сравнительные тесты программного обеспечения и сервисов, посмотрите какие критерии выбирают они. Тестирование удобства пользования (UX) тоже тестирование.
    Но если просто решать задачу для галочки, проверить нужно валидацию ввода, для текстовых данных ввод букв разных алфавитов. Комбинаторные тесты можно делать. Если поля два, четыре варианта ввода (пустой ввод, слишком длинный ввод, неполный ввод, верный ввод) для одного поля и четыре для другого у вас уже получается 16 комбинаций.
    Можно проверить рудиментарные требования к безопасности, например использует ли сервис шифрованый протокол. Стираются ли поля при перезагрузке страницы, при откывании страницы заново.
    Думайте, задание для того и дано, чтобы вы тренировались думать как тестировщик, а не для того чтобы вы дали верный ответ.
    Ответ написан
    Комментировать
  • Как грамотно сделать page object + pytest, чтобы не передавать фикстуру в каждый page класс?

    lxsmkv
    @lxsmkv
    Test automation engineer
    у нас тоже так, только обьект называется не app , а root. Правда мы тестируем embedded системы через GUI.
    if root is None:
    root = testcore.createRoot(); #ядро фреймворка выдает нам этот обьект
    и все функции тестового фреймворка требуют этого объекта. У меня каждый page-класс имеет self.root ссылку создаваемую в конструкторе и везде где надо при использовании фреймворка я её передаю.
    tst.press_and_release_button(self.root, buttonname='Button1') # tst тут ссылка на фреймворк.
    Т.е я так понимаю у нас сделали пользовательскую обертку воркуг ядра, а у вас напрямую.
    Я этот фреймворк не писал, а писал паренъ который и интерпретатор питона на яве для нашей системы написал, потому что jython сильно много памяти ест. И я верю в то, что если оно так, то так надо :) А я только пользуюсь всем этим добром, но вполне себе подход нормальный.
    На этот объект можно еще переменных навесить и передавать данные из одного места в другое.
    Ответ написан
    Комментировать
  • Есть ли хороший пример page object pattern на python?

    lxsmkv
    @lxsmkv
    Test automation engineer
    у нас свой фреймворк, мы делаем end-to-end тестирование embedded системы через GUI.
    я не выношу локаторы, они прописаны в классе в функциях.
    Некоторые у нас выносят в локаторы в отдельные файлы. Можно и так, однако я не вижу преимущества.
    Так я точно знаю какие локаторы относятся к какой странице. Начала вылетать функция, поправил локатор, не стало страницы, выкинул, поправил последовательность в тесте. Старые локаторы "автоматически" удаляются вместе со старыми page-объектами.
    В нашем случае нам не приходится ссылатъся на один и тот же элемент в рамках разных страниц, потому что у нас дерево виджетов построено от страницы, и даже если виджеты одинаково называются это совершенно разные обьекты. В веб-тестировании, однако, это не так, поэтому аргумент резонный.
    tf тут это ссылка на тест-фреймворк, который дает нам базовые функции для взаимодействия с GUI.
    class LoginView:
    	def __init__(self):
    	  self.viewname='ABC'
    	def enter(self):
    	  tf.executeApiCall()
    	def wait_for_view(self):
    		tf.wait_for_view(self.viewname)
    	def press_cancel_button(self):
    		tf.press_widget('xyz.ABC')
    	def enter_username(self, u):
    		tf.enter_string('xyz.ABC.inputfield', u)
    	def check_error_popup_visible(self,expect):
    		if expect==True:
    			tf.wait_for_view(view='xyz.ABC.LoginErrorPopup')
    		else:
    	 		tf.wait_for_view(notinview='xyz.ABC.LoginErrorPopup')
    	def press_login_button(self):
    		tf.press_widget('xyz.ABC.Login')

    на стороне теста выглядит как-то так
    username='Kolya'
    main_view = MainView()
    login_view = LoginView()
    login_view.enter()
    login_view.wait_for_view()
    login_view.enter_username(u=username)
    login_view.press_login_button()
    login_view.check_error_popup_visible(expect=True)
    login_view.confirm_error_popup()
    login_view.check_error_popup_visible(expect=False)
    login_view.check_inputfield_text_equals(expect=username)
    login_view.leave()
    main_view.wait_for_view()
    Ответ написан
    Комментировать
  • Вопрос по алгоритму в списке?

    lxsmkv
    @lxsmkv
    Test automation engineer
    a = [12,35,49]
    bracket = 3;
    result = []
    for x in a:
    	for i in range(-bracket,bracket+1):
    		result.append(x+i);
    print result

    [9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 46, 47, 48, 49, 50, 51, 52]

    а можно и так
    items = [12,35,49]
    bracket = 3
    result = sum(list(map(lambda x: range(x-bracket,x+bracket+1), items)),[])
    print result

    [9, 10, 11, 12, 13, 14, 15, 32, 33, 34, 35, 36, 37, 38, 46, 47, 48, 49, 50, 51, 52]
    Ответ написан
    7 комментариев
  • Что удобнее, тем, кто уже пробовал - Передавать ошибку return или сразу бросать Exception прямо из функции/foreach?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Через return можно возвращать код ошибки и собирать ошибки этажом выше а потом что то делать в зависимости от того какие ошибки были получены. В тестировании например может иметь место такой подход. Потому что эксепшн сразу прервет выполнение теста. А это может быть не желательно в конкретном случае. Зависит как уже сказали от архитектуры.

    Вот ещё, недавно наткнулся:
    https://habrahabr.ru/company/mailru/blog/322804/ - Выбор правильной стратегии обработки ошибок (части 3 и 4)
    Ответ написан
    6 комментариев
  • Проблемы с кодировкой при парсинге html?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Вполне себе правильная кракозябра думаю
    https://ru.wikipedia.org/wiki/URL "Кодирование URL"

    Java APi URLEncoder:
    "For example using UTF-8 as the encoding scheme the string "The string ü@foo-bar" would get converted to "The+string+%C3%BC%40foo-bar" because in UTF-8 the character ü is encoded as two bytes C3 (hex) and BC (hex), and the character @ is encoded as one byte 40 (hex)."

    если вы об этом.
    Ответ написан
    Комментировать
  • Как объединить множество текстовых файлов в один?

    lxsmkv
    @lxsmkv
    Test automation engineer
    superuser.com/questions/111825/a-command-line-or-b...
    copy /b *.txt newfile.txt
    или с добавлением пустой строки
    type *.txt > newfile.txt
    (не пробовал)
    Ответ написан
    Комментировать
  • Не пойму пример из headfirst java про элементы объектов?

    lxsmkv
    @lxsmkv
    Test automation engineer
    вернитесь на страницу 8.
    class Main {
      public static void main(String[] args) {
        Dog[] pets;
        pets = new Dog[7];
      }
    }
    class Dog{}

    вне блока (читай "метода") возможно только обьявление переменных. Операция присваивания, как и любая другая - нет. Но в тоже время обьявление с присваиванием, что фактически будет являтся инициализацией переменной, в теле класса допустимо.
    Да, это вам не питон какой-нибудь :) Почитайте как-нибудь эссе "Execution in the Kingdom of Nouns".

    Добавлю, что эта книга по моему мнению, не каждому подойдет для изучения явы как первого языка. Если у вас ситематический склад ума, может быть трудно работать с этой книгой. Попробуйте тогда что-нибудь более "серьезное". Например книги по подготовке к экзамену Java OCA .
    Ответ написан
    Комментировать
  • Как понять выражение при записи значений в поток вывода?

    lxsmkv
    @lxsmkv
    Test automation engineer
    пусть
    х = 0110
    y = 1001
    выражение записывает оба значения в одно сперва сдвигая первое на четыре знака влево, а потом соединяет со вторым значением
    0110 0000
    0000 1001
    -------------
    0110 1001

    Можно унаследоваться и перегрузить конструктор, и работать с закодированым значением.
    Или раскодировать при передаче значений в конструктор (int, int)
    Зачем это все так сделано? Думаю для экономии места, 32 бита или 2 по 32. И если таких точек дофига, то это может влиять на производительность. Битовые операции насколько я знаю очень "легкие" для обработки. Но в таком случае нужно работать с кодированым значением, а сначала экономить а потом переливать в (int, int) - не вижу смысла, да. Хотя, может если кодированое значение должно передаваться по каналу связи, это уменьшит нагрузку на поток.
    Ответ написан
  • Как подсвечивать каждый этаж(дома) на svg изображении?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Может немного не в тему, но заставлять пользователя возить мышкой по графику только для того, чтобы тот выяснил что свободных квартир 0 из 3 - это форменная насмешка над посетителем.
    Не спорю, сам прием интересный, но применять его надо, сперва спросив себя, чего я хочу добиться этим приемом.
    Ответ написан
  • Как найти конкретное слово в строке и удалить его на python?

    lxsmkv
    @lxsmkv
    Test automation engineer
    import string
    str1 = "String replace test"
    str1 = string.replace(str1,"epl", "")
    print str1

    String race test
    Ответ написан
    Комментировать
  • С чего начать изучение веб-дизайна?

    lxsmkv
    @lxsmkv
    Test automation engineer
    попробуйте ввести в поисковик: книги по дизайну site:toster.ru
    лень смотреть все, посмотрите этот ответ: Книга по дизайну сайтов?

    И добавлю, учебник дизайна - это нонсенс. Mаксимум в так называемых книгах по дизайну покажут примеры каких-то решений. Я настраивал свое восприятие на рецензиях опытных дизайнеров у самизнаетекого
    Ответ написан
    Комментировать
  • Cinema 4D на Ubuntu?

    lxsmkv
    @lxsmkv
    Test automation engineer
    нафиг он нужен, все крутые ребята давно перешли на Blender 3D, он кроссплатформенный и бесплатный.
    по теме: ставится сначала wine потом cinema. Демоверсия с сайта скачивается после регистрации.
    вот видео:
    How To Run Cinema 4D R14 On Linux Ubuntu (Deepin 2014.3)
    https://www.youtube.com/watch?v=a5nXogvU9aI
    Ответ написан
  • Как понять создание дочернего экземпляра типа родителя?

    lxsmkv
    @lxsmkv
    Test automation engineer
    class Main {
      public static void main(String[] args) {
        Phone p = new MyPhone();
        p.sayHello();
      }
    }
    class Phone{
      void sayHello(){System.out.println("Hello Phone");}
    }
    class MyPhone extends Phone{
      void sayHello(){System.out.println("Hello MyPhone");}
    }

    дочерний класс переписывает/перекрывает (overrides) метод родительского класса. Если убрать имплементацию из дочернего класса то будет вызван родительский метод. Используется тип ссылки более общего типа, потому что это "наименьший общий делитель" всего семейного древа, так сказать. Дочерние классы могут может еще много чего, но то что определено в родительском классе они могут гарантированно.
    Ссылка родительского общего типа может использоваться при обходе коллекций, когда эелементы коллекции могут быть разными детьми но нужно у каждого вызвать этот метод. Так работает например шаблон наблюдатель. Используется тип интефейса как общий знаменатель, все классы которые хотят получать обновления, заносятся в список. И когда событие наступает, пробегаем список и у каждого элемента дергаем метод update, a что произойдет при update решает каждый класс для себя сам.
    Ответ написан
    Комментировать
  • Как правильно добавлять элемент по клику?

    lxsmkv
    @lxsmkv
    Test automation engineer
    я тут подумал если у вас js оторвется или имена классов или css поменяется, будет фигово все время помнить что у вас кусок фронтенда в скрипте лежит. Mожно было бы вернуть html в html, где ему собственно место, а через скрипт клонировать этот шаблон при добавлении.
    Ответ написан
    Комментировать
  • Как передать переменную div через form post?

    lxsmkv
    @lxsmkv
    Test automation engineer
    <form action="demo_form.asp" onsubmit="myFunction()">
    <input type='hidden' name='mess' id='mess'>
    <div name='mess_s' id='mess_s' class='f_ot' contenteditable='true'>blabla</div>
      Enter name: <input type="text" name="fname">
      <input type="submit" value="Submit">
    </form>
    
    <script>
    function myFunction() {
        document.getElementById('mess').value=document.getElementById('mess_s').innerHTML;
        document.getElementById('mess_s').innerHTML = '';
    }

    вроде работает
    проверял тут:
    www.w3schools.com/jsref/tryit.asp?filename=tryjsre...
    Ответ написан
    Комментировать