• Python or Java for immigration?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Уважаемый Дмитрий, сделайте первый шаг, откройте зарубежный сайт с вакансиями и посмотрите, какие профили там ищут. А далее, в соответствии с этими наблюдениями, адаптируйте свой багаж знаний.
    P.S.: Намеренно не даю ссылок на зарубежные сайты поиска вакансий, ведь, если вы собираетесь за рубежом искать работу, то эти сайты уже у вас в закладках.
    Ответ написан
    Комментировать
  • Случайное число с заданной вероятностью, какой алгоритм?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Вот склепал на скорую руку:
    https://repl.it/K2UJ/2
    import random 
    
    def getrand():
      r = random.randint(1,100)
      if  r < 23:
        return 0 # 22%
      if 42 > r >= 23:
        return 1 # 19%
      if 58 > r >= 41:
        return 2 # 16%
      if 71 > r >= 57:
        return 3 # 13%
      if 81 > r >=70:
        return 4 # 10%
      if 89 > r >=80:
        return 5 # 8 % 
      if 95 > r >=88:
        return 6 # 6%
      if 99 > r >=94:
        return 7 # 4%
      if 101 > r >=98:
        return 8 # 2 %
    result = []
    rng = 1000000
    for x in range(0,rng):
      result.append(getrand())
    
    print "0 : "+str(result.count(0)/float(rng))+" ~ " +str(0.22 - result.count(0)/float(rng))
    print "1 : "+str(result.count(1)/float(rng))+" ~ " +str(0.19 - result.count(1)/float(rng))
    print "2 : "+str(result.count(2)/float(rng))+" ~ " +str(0.16 - result.count(2)/float(rng))
    print "3 : "+str(result.count(3)/float(rng))+" ~ " +str(0.13 - result.count(3)/float(rng))
    print "4 : "+str(result.count(4)/float(rng))+" ~ " +str(0.10 - result.count(4)/float(rng))
    print "5 : "+str(result.count(5)/float(rng))+" ~ " +str(0.08 - result.count(5)/float(rng))
    print "6 : "+str(result.count(6)/float(rng))+" ~ " +str(0.06 - result.count(6)/float(rng))
    print "7 : "+str(result.count(7)/float(rng))+" ~ " +str(0.04 - result.count(7)/float(rng))
    print "8 : "+str(result.count(8)/float(rng))+" ~ " +str(0.02 - result.count(8)/float(rng))
    
    freqs = [ result.count(0)/float(rng),result.count(1)/float(rng),result.count(2)/float(rng),result.count(3)/float(rng),
    result.count(4)/float(rng),result.count(5)/float(rng),result.count(6)/float(rng),result.count(7)/float(rng),result.count(8)/float(rng)]
    
    print sum(freqs)


    0 : 0.219347 ~ 0.000653
    1 : 0.190018 ~ -1.8e-05
    2 : 0.160421 ~ -0.000421
    3 : 0.129805 ~ 0.000195
    4 : 0.100175 ~ -0.000175
    5 : 0.07974 ~ 0.00026
    6 : 0.060102 ~ -0.000102
    7 : 0.040174 ~ -0.000174
    8 : 0.020218 ~ -0.000218
    1.0
    Ответ написан
    Комментировать
  • Тестирование ПО с использованием OpenGL?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Самое нудное решение часто бывает верным, потому что чудес не бывает :)
    Вы просто когда все системы настроите и проапдейтите, сделайте копию диска, чтобы после настроек-перенастроек можно было тупо откатиться назад на чистую инсталляцию. И одну копию сделайте сейчас, чтобы вернуть все обратно после экспериментов.

    Как вариант, попробуйте Hyper-V.
    Ответ написан
    Комментировать
  • QA Automation или Dev?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Не отказывайтесь, позанимайтесь пару годиков автоматизацией - это бесценный опыт. Вам тоже придется программировать, только не продукт, а тесты. А чтобы писать тесты нужно в продукте разбираться не хуже разработчика. Через год вы сможете делать все тоже самое что делает разработчик и еще и автоматизацию, а разработчик так и останется разработчиком. Я работаю автоматизатором тестирования и получаю больше чем некоторые девы у нас в команде. И у меня есть перспективы, перейти в консалтинг.
    Но надо сказать я и выкладывался для этого три года по полной.
    Понимаете если в команде все будут только кодить - ничего хорошего из этого не выйдет. Если в понятиях какой нибудь многопользователькой игры говорить, то программист это штурмовик. А нужно еще звено прикрывающее тыл и медсанчасть- это QA. А еще нужно стратегическое звено - это архитектор. А еще нужна логистика - это DevOps. Если QA внимательно, с головой, относится к своей работе, то он может давать советы архитектору DevOps и разработчикам. Например - слишком много ранений в голову, может будем одевать каски? У раненых солдат мозоли на ногах, нужна более удобная обувь.
    Я, побыв автоматизатором, не хочу становиться рядовым разработчиком. Это будничная однообразная работа. А автоматизация ставит все время интереcные задачи. Заставляет учиться, развивать себя. Это абсолютно уникальные знания. Когда у разработчиков зытык в задаче, я могу им помочь, а когда у меня затык они мне не могут помочь. Понимаете разницу?
    Ответ написан
    Комментировать
  • Можно ли в линуксе передать экземпляр класса из одного процесса в другой и выполнить с ним действия?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Одна тема называется [python] interprocess communication,
    a другая [python] object serialization
    А это наверное ответ на ваш вопрос
    Ответ написан
    1 комментарий
  • Каким образом выполнить множественную замену строк в файле?

    lxsmkv
    @lxsmkv
    Test automation engineer
    нашел тут на просторах интернета такое решение:
    config = "1 2 3 4 5 6"
    substitutions = {"2":"7", "3":"6"}
    def replace_all(text, dic):
        for i, j in dic.iteritems():
            text = text.replace(i, j)
        return text
    
    print replace_all(config, substitutions)

    вернет
    1 7 6 4 5 6
    Ответ написан
    Комментировать
  • Классы и объекты в python, self?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Спасибо вам за вопрос. Самому стало интересно докопаться до сути. Нашел хорошее объяснение
    тут
    Ответ написан
    Комментировать
  • Как выжить джуну единственным разработчиком на проекте?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Согласен со всеми выше высказавшимися - это шанс. Тем более платят не так чтобы приходилось жаловаться. Неоплачиваемую переработку делать не заставляют? Тогда вообще практически идеальные условия. А бардак он везде есть. И там где двести разработчиков и там где два.
    Ответ написан
    2 комментария
  • Что нужно для развития логики?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Решайте задачки по программированию. Попробуйте обучающие игры типа codecombat.com, js.checkio.org, screeps.com, codewars.com, codehunt.com ( правда тут java /c#)
    Попробуйте порешать задачки на этих интерактивных курсах: repl.it/community/classrooms/24696 repl.it/community/classrooms/26415
    и тут coderbyte.com

    Рекомендую еще книжку Самоучитель JavaScript (Дмитриева М.) Там на яваскрипте решаются серьезные алгоритмические задачи.

    Учебник по логике вам мало чем поможет, так же как и учебник по физкультуре мало поможет научиться подтягиваться на турнике по 20 раз.
    Ответ написан
    Комментировать
  • Что делать веб разработчику, если уже всё придумано?

    lxsmkv
    @lxsmkv
    Test automation engineer
    вы дизайнер графических интерфейсов, так? ив вы говорите что все уже придумано? То есть все интерфейсы которыми вы пользуетесь и с которыми знакомы идеальны и не нуждаются в улучшении?
    Тогда не понятно почему фирмы делают редизайн из года в год. Непонятно зачем гугл придумал material design, зачем эппл меняет дизайн Mac OS, зачем хабр делает редизайн , почему меняется дизайн навигационных систем..
    Ответ написан
    3 комментария
  • В программисты или в тестировщики (идти)?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Предлагаю вам проверочное задание-шутку для профориентации:
    Посмотрите на этот
    юнит-тест
    public class ListMapTest {
    
        @Test
        public void testListMap() {
            ListMap<String, String> listMap = new ListMap<String, String>();
            listMap.put("bob", "hello");
            assert "hello".equals(listMap.get("bob"));
            assert "hello".equals(listMap.remove("bob"));
            assert listMap.size() == 0;
            assert listMap.isEmpty();
    
            listMap.put("abc", "1");
            listMap.put("def", "2");
            listMap.put("ghi", "3");
            listMap.put("jkl", "4");
            listMap.put("mno", "5");
            assert "3".equals(listMap.get("ghi"));
            assert listMap.size() == 5;
            assert !listMap.isEmpty();
    
            // check iteration order, should be consistent
            for (int i = 0; i < listMap.size(); i++) {
                String expectedValue = Integer.toString(i + 1);
                String key = listMap.getKey(i);
                String value = listMap.getValue(i);
                Entry<String, String> entry = listMap.getEntry(i);
                assert key.equals(entry.getKey());
                assert value.equals(entry.getValue());
                assert expectedValue.equals(value);
            }
        }
    }


    (из опенсорсного игрового движка jmonkeyengine .)

    Что можно в нем улучшить ?

    Варианты ответов:
    1. ничего
    2. использовать junit
    3. разбить на несколько тестов и добавить недостающие проверки


    Ключ: если вы ответили 1. или 2. - вам в разработчики.
    Ответ написан
    1 комментарий
  • Анализ граничных значений для условия "строго больше"?

    lxsmkv
    @lxsmkv
    Test automation engineer
    4 можно не проверять (как и 6 в первом случае). Просто понимание больше или больше-равно у многих программистов такое же как понимание индекса в массиве, казалось бы самые основы, но на практике одна из самых частых ошибок, (я и сам подтормаживаю на этой теме когда не выспался)
    Давайте разберем на примере. Люблю примеры.
    Допустим у нас минимальная длина пин-кода в первом случае минимум 5 символов, во втором случае минимум 6 символов. Как только набрано необходимое количество символов кнопка "ок" становится активной.
    Чтобы проверить первый случай, нужно ввести 4 символа и убедиться что кнопка не активна, ввести пять символов и убедиться что кнопка активна.
    Чтобы проверить второй случай нужно ввести 5 символов и убедиться что кнопка не активна и ввести 6 символов и убедиться что кнопка активна.

    Ну и еще максимальное значение нужно проверить раз уж на то пошло (maxInt+1 для некоторых языков критичен) либо в примере с полем ввода максимальное количество символов.

    Вернемся к примеру с полем ввода. Допустим поле из-за програмной ошибки изначально содержит два невидимых символа.
    Мы вводим в первом случае 3 знака и кнопка ОК становится активной, хотя не должна.
    Так что граничные значения это все теория, без которой никуда, но чтобы найти баги надо понимать устройство компонент и принципы их взаимодействия и отталкиваться от этого знания. На чисто механистическом подходе далеко не уедешь.
    Ответ написан
    Комментировать
  • Как высчитать или координаты находятся внутри полигона?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Все понятно, Гугл обиделся на вас, что вы им не пользуетесь и ушел.
    Попробуйте заманить его обратно этим запросом:
    "point in polygon mongodb"
    Ответ написан
    Комментировать
  • Какая модель списания средств лучше?

    lxsmkv
    @lxsmkv
    Test automation engineer
    Можно списывать в тот момент когда сумма израсходуется. Но тогда нужно отталкиваться не от календарного месяца а от какого-то количества дней например 31 день . Когда клиент кладет деньги на счет, списание происходит ровно через 31 день. Мне кажется такая модель проще для понимания для клиента, и наверное расчет конечной даты будет проще. Есть фунцкии для прибавления к дате х дней. будет плавающий день расчета. Опеределить клиентов у которых расчет будет в определенный день тоже весьма очевидно. Нужно поле день расчета, который будет день внесения средств плюс 31 день (или икс, который вы определите). Клиенту это будет однозначно приятно, если он за свои деньги всегда будет одинаково долго пользоваться сервисом, а не 28 дней в феврале.
    Ответ написан
  • Как добиться независимости в тестах (phpunit)?

    lxsmkv
    @lxsmkv
    Test automation engineer
    я в основном делаю ui тесты и у меня некоторые тесты связаны друг с другом. конечное состояние первого теста является начальным сосотоянием следующего. Например первый тест "зайти в формуляр" а следующий за ним "ввести данные в первую строку" а затем тест "ввести данные во вторую строку" а потом "нажать на отправку данных" а потом "тест сообщения об отправке". Естественно если первый тест завалится, завалятся и все после него, хотя реальная проблема только одна. Единственный серьезный недостаток такого подхода, это возможное перекрытие ошибок. Т.е. в билде может сломаться заход в формуляр, и отображение сообщения об отправке. Вторая проблема будет перекрыта первой.
    Но меня устраивает такой подход по следующим соображениям.
    - Если что-то сломалось в приложение надо в первую очередь чинить приложение, а не писать тонны дополнительного тестировочного кода.
    - Тестировочный код тоже код, чем его больше тем больше вероятность сделать ошибку в нем.
    - Лучше потратить время на увеличение покрытие пользовательских сценариев, чем на создание красивой и каноничной автоматизации.
    - Зависимые тесты выполняются быстрее, (а у нас время тестирования билда во всех вариациях уже перевалило за 16 часов)
    - Чинить по одной ошибке за раз - хорошо, пытаясь починить сразу несколько можно сломать что-то еще.

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

    Но это все не по вашему вопросу. По вашему вопросу - да, писать тонны моков (не нужно). У меня например есть тесты которые проверяют как данные от железа передаются в api графического клиента. при проверке фунцкионала графического клиента, я опираюсь на корректную работу api графического клиента, поскольку им пользуюсь. Так же я опираюсь на корректную работу виджетов. И если какие-то условия не будут работать многие ui тесты посыплются. Мы найдем причину и устраним ее. Чтобы в таком случае падал только один тест, который специально сделан для нахождения этой ошибки, вам придется отвязать тестируемую компоненту от всех внешних зависимостей. Теоретически написав столько же кода сколько в самом приложении. Вы готовы к этому?

    P.S.: стоит добавить: наш тест-фреймворк выполняет тесты в алфавитном порядке и не поддерживает параллельное выполнение в принципе.
    Ответ написан
    Комментировать
  • Как быстро попробовать себя в разных сферах?

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

    lxsmkv
    @lxsmkv
    Test automation engineer
    Ответ написан
    Комментировать
  • Как отфильтровать объект по ManyToManyField?

    lxsmkv
    @lxsmkv
    Test automation engineer
    master1 = ["s", "p", "c"]
    master2 = ["d", "a", "s"]
    master3 = ["p", "c", "a"]
    k = ["s","p"] # критерии которые все должны содержаться в списке
    print filter(lambda m:len(set(m) - set(k)) == len(m)-len(k), [master1, master2, master3])

    вернет только значение master1
    Смысл такой:
    если после вычета элементов k из m длина m станет на len(k) меньше, значит нам удалось вычесть все элементы, а значит они все содержались в m.
    Ответ написан
  • Как разработать web-проекты на примере новостного сайта или интернет-магазина?

    lxsmkv
    @lxsmkv
    Test automation engineer
    В современной веб разработке этапы примерно такие:
    а) найти подходящий готовый конструктор (cms или фреймворк)
    б) прочитать его документацию
    в) зафигачить сайт.

    - базу данных проектировать тоже не придется, фреймворк/cms все сделают за вас. (хотя в случае с фреймворком, придется как-то описать структуру данных которые вы будете хранить. Как это делается, обычно описано в документации к фреймворку)
    - при использовании фреймворка всегда есть рекомендованая или стандартаная структура папок (описаная в документации) ее и нужно придерживаться.
    - фреймворк дает больше гибкости, но нужно больше разбираться. cms больше подходит для типовых проектов.
    Ответ написан
    1 комментарий