Как стать автором
Обновить
33
0
Махмуд @Maxmyd

Пользователь

Отправить сообщение

Масштабирование Selenium

Время на прочтение19 мин
Количество просмотров16K

Представьте, что у вас есть всего один тест с использованием Selenium. Что может сделать его нестабильным? Как его ускорить? Теперь представьте, что тестов стало два. Теперь представьте сотню. Как заставить быстро отработать такую кучу тестов? Что произойдет, если количество тестов продолжит расти?


В этой статье Саймон Стюарт проведет нас по нелегкому пути масштабирования, от одного теста до параллельно исполняющихся сотен тестов. Мы познакомимся и с проблемами, которые при этом появляются, и с практическими методами решения этих проблем. Будет код на Java и некоторые мысли о развитии тестовой инфраструктуры.



Прототипом этой статьи является доклад Саймона Стюарта на Heisenbug 2017 Moscow. Саймон — создатель WebDriver, технологии, которой сейчас почти 11 лет. Он стал руководителем проекта Selenium около 9 лет назад. В Google занимался масштабированием Selenium, от нескольких десятков тысяч до нескольких миллионов тестов каждый день, на их инфраструктуре. Затем перешел в Facebook. В данный момент занимается разработкой спецификации WebDriver для W3C, которая входит в группу тестирования и тулинга в W3C. Можно сказать, что на основе WebDriver и создается стандарт.

Читать дальше →
Всего голосов 28: ↑25 и ↓3+22
Комментарии6

Что ещё мы проверяем при помощи Selenium, кроме логики интерфейса

Время на прочтение10 мин
Количество просмотров34K
Привет, Хабр!

Меня зовут Виталий Котов, я работаю в отделе тестирования Badoo. Большую часть времени я работаю с Selenium. Этот замечательный инструмент мы используем для решения разнообразных задач: от тестирования функционала до упрощения работы с логами ошибок и проверки взаимодействия с API.

О том, какие задачи нам помогает решать Selenium, и пойдёт речь в этой статье. Поехали! :)


Читать дальше →
Всего голосов 58: ↑58 и ↓0+58
Комментарии36

ASP.NET Core: Механизмы предотвращения атак 2.0

Время на прочтение20 мин
Количество просмотров25K

По встроенным механизмам безопасности ASP .NET Core написано мало статей. Даже официальная документация имеет пробелы. В этой статье мы пройдём по всем основным компонентам, имеющим отношение к безопасности, и разберём, как это работает внутри.


Если вы используете старый добрый ASP .NET, то для вас будет полезна информация по внутреннему устройству компонентов безопасности и лучшим практикам их использования. Здесь вы найдёте ответы на следующие вопросы: как реализованы современные анти-XSS механизмы и как их правильно использовать в ASP .NET Core? Как правильно работать с cookies и какие подводные камни там могут встретиться? Как был переписан механизм защиты от CSRF? Как правильно работать с криптографическими алгоритмами? Кроме того, рассказывается про опыт участия в Bug Bounty по поиску уязвимостей в ASP .NET Core.


Перед чтением рекомендуется освежить в памяти атаки из списка OWASP Top 10.


Прототипом статьи является доклад Михаила Щербакова на конференции DotNext 2017 Moscow. Михаил — Microsoft .NET MVP, участник .NET Core Bug Bounty Program, соорганизатор сообщества .NET программистов (Московское комьюнити называется MskDotNet, питерское — SpbDotNet). По работе последние 5 лет занимается безопасностью. Работал в Positive Technologies, в Cezurity, сейчас как консультант работает напрямую с заказчиками, по большей части в этой же сфере. Профессиональные интересы: статический и динамический анализ кода, информационная безопасность, автоматизация отладки кода, исследование внутреннего устройства .NET CLR.


В этом тексте огромное количество картинок со слайдов. Осторожно, трафик!

Читать дальше →
Всего голосов 54: ↑53 и ↓1+52
Комментарии2

Книжная распродажа

Время на прочтение1 мин
Количество просмотров15K
image

Привет, Хаброжители! Настало время для очередной распродажи. Подробности внутри.
Читать дальше →
Всего голосов 25: ↑25 и ↓0+25
Комментарии28

Вопросы для собеседования бэкенд-разработчика

Время на прочтение16 мин
Количество просмотров193K
Этот список появился как личная памятка по темам, которые я обсуждал с коллегами и друзьями и в которых хотел разобраться поглубже…

Я не большой любитель задавать технические вопросы на собеседованиях: по мне так лучше посидеть с кандидатом (или кандидаткой) за клавиатурой над каким-то реальным кодом, реальной проблемой — и целый день заниматься парным программированием, желательно поочерёдно с остальными членами команды. Но я считаю, что некоторые технические вопросы могут быть хорошей отправной точкой для начала увлекательного и приятного разговора и позволят глубже узнать друг друга.

В этом репозитории собран ряд вопросов, связанных с серверной частью, которые можно использовать при проверке потенциальных кандидатов. Ни в коем случае не рекомендуется задавать все вопросы одному кандидату: это займет несколько часов и вообще не имеет смысла, потому что они охватывают слишком широкий спектр тем. Никто не может знать всего. Выберите наиболее актуальный раздел и самые интересные вопросы, чтобы развернуть беседу.
Читать дальше →
Всего голосов 83: ↑61 и ↓22+39
Комментарии274

Переход с AngularJS на Angular: цели, планы и правила переноса элементов (1/3)

Время на прочтение13 мин
Количество просмотров14K


В январе мы в Skyeng закончили перевод нашей платформы Vimbox с AngularJS на Angular 4. За время подготовки и перехода у нас накопилось много записей, посвященных планированию, решению возникающих проблем и новым конвенциям работы, и мы решили поделиться ими в трех статьях на Хабре. Надеемся, что наши заметки окажутся полезными структурно похожим на наш Vimbox проектам, которые только начали переезжать или собираются сделать это.

Читать дальше →
Всего голосов 29: ↑28 и ↓1+27
Комментарии5

Избавляемся от boilerplate для валидации в ASP.NET MVC

Время на прочтение2 мин
Количество просмотров11K
В большинстве примеров проверка входных данных ASP.NET MVC осуществляется следующим образом:

        [HttpPost]
        public IActionResult Test(SomeParam param)
        {
            if (!ModelState.IsValid)
            {
                return View(param);
                // return Json({success: false, state: ModelState});
            }
            
            dbContext.UpdateData(param);

            return RedirectToAction("index");
            // return Ok({success: true});
        }

Этот код можно улучшить:

  1. вынести валидацию из тела метода и избавиться от дублирования if (!ModelState.IsValid)
  2. вернуть код ответа 422
Читать дальше →
Всего голосов 22: ↑18 и ↓4+14
Комментарии39

10 лучших бесплатных CRM систем для бизнеса

Время на прочтение9 мин
Количество просмотров250K

Для помощи малому бизнесу мы впервые сделали подборку бесплатных СRM систем. Мы ранжировали список таких систем в соответствии с наивысшими оценками, используя отзывы реальных пользователей (по состоянию на 13 октября 2017)

Стартапы и малый бизнес ищут ПО СRM для управления постоянно растущей базой клиентов, а также для контроля качества обслуживания важных клиентов. Однако для «наименьших» представителей малого бизнеса покупка и установка СRM системы может требовать больших затрат времени и денег.

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

Малому бизнесу и стартапам необходимо место для удобного хранения данных о клиентах, инструменты для прогнозирования и проведения маркетинговых активностей.

К счастью, основываясь на отзывах реальных пользователей G2 Crowd, мы составили список из 10 лучших (на основе оценок пользователей по удобству использования) бесплатных CRM-инструментов! Часть CRM компаний в этом списке предлагают бесплатно использовать свое ПО только в течение пробного периода, другие — абсолютно бесплатны.
Читать дальше →
Всего голосов 16: ↑10 и ↓6+4
Комментарии23

Как найти лучшие авиабилеты в интерфейсе гугл-таблицы

Время на прочтение3 мин
Количество просмотров16K

Начало


Я часто езжу в поездки и покупаю авиабилеты.
И так же часто страдаю от интерфейса агрегаторов авиабилетов.
Я не могу выбрать билет и совершить покупку.


Кейс


Я точно знаю, куда хочу полететь.
Примерно знаю на сколько дней.
И примерно в какие даты — например в этом месяце.


В этот раз я захотел слетать в Серфаус — это горнолыжная деревня в Австрии.
Улететь не ранее 5 января, вернуться на позднее 15 января. На 6-8 дней.


Теперь нужно найти лучший билет под эти условия.
"Лучший" в моем случае — это комбинации объективной цены и субъективного удобства перелета — время вылета/прилета, аэропорт вылета, авиакомпания и так далее.


Как кейс решается у агрегатора авиабилетов


  1. Трансформирую деревню Серфаус в три ближайших аэропорта — Мюнхен, Инсбрук и Цюрих с помощью гугл-карт.
  2. Иду в агрегатор авиабилетов. Нахожу инструмент типа "Календарь низких цен".
  3. Открываю его в трех вкладках для трех аэропортов.
  4. Выбираю январь.
  5. Начинаю тыкать в каждый день января, чтобы увидеть время вылета/прилета и цену билета.
  6. Если мне понравился какой-то билет, тыкаю в него, чтобы убедиться, что билет реально есть. Потому что кеш.
  7. Чтобы запомнить, в какой день какой билет мне понравился, я записываю его в блокнот или таблицу.

В последних трех пунктах я страдаю.
Потому что я не хочу тыкать и проверять. Я не хочу переключаться между вкладками.
А хочу увидеть реально доступные билеты со временем вылета и ценой и выбрать один из них.
И купить его.


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


Как кейс должен решаться


  1. Указываю "Серфаус" в поле "Куда" в агрегаторе.
  2. Выбираю примерные даты.
  3. Выбираю подходящую продолжительность.
  4. Получаю список билетов для покупки.
  5. Выбираю подходящий билет и покупаю.

… такого сценария работы нет у агрегаторов.

Читать дальше →
Всего голосов 16: ↑15 и ↓1+14
Комментарии29

Постъядерный караван в 35 килобайт

Время на прочтение12 мин
Количество просмотров21K
35 килобайт минифицированного кода на обычном JavaScript, семь городов, пустоши, радиоактивные гекконы, съедобные кактусы, встречные караваны и бандиты. Что это? Это небольшая игра, которая запускается в браузере. Ее принципы довольно просты для повторения и в самой примитивной версии ее можно воссоздать, наверное, на любом устройстве, если там есть устройство вывода и генератор случайных чисел. Но сегодня я хочу рассказать, как я реализовал ее для современных браузеров.

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

Весь сеттинг, мир и логику можно модифицировать, как вам вздумается — исходный код и графика распространяется как public domain, то есть без ограничений на копирование и использование.

Читать дальше →
Всего голосов 52: ↑51 и ↓1+50
Комментарии76

EntityFramework: (анти)паттерн Repository

Время на прочтение15 мин
Количество просмотров114K
Repository Pattern
Репозиторий является посредником между слоем доступа к данным и доменным слоем,
работая как in-memory коллекция доменных обектов. Клиенты создают декларативные
описания запросов и передают их в репозиторий для выполнения.
  — свободный перевод Мартина Фаулера

EntityFraemwork предоставляет нам готовую реализацию паттернов Repository: DbSet<T> и UnitOfWork: DbContext. Но мне часто приходится видеть, как коллеги используют в своих проектах собственную реализацию репозиториев поверх существующих в EntityFraemwork.


Чаще всего используется один из двух подходов:


  1. Generic Repository как попытка абстрагироваться от конкретного ORM.
  2. Repository как набор запросов к выбранной таблице БД (паттерн DAO).

И каждый из этих подходов содержит недостатки.

Читать дальше →
Всего голосов 47: ↑45 и ↓2+43
Комментарии159

Тестируем Web UI на F# и canopy

Время на прочтение3 мин
Количество просмотров6.1K
Доброго времени суток! С недавнего времени я начал увлекаться функциональным программированием, поэтому в этой статье я бы хотел поделиться с вами моими находками. Мне очень симпатизирует минимализм синтаксиса функциональных языков. Сила и красота, которую несут за собой несколько строк кода.

В процессе UI тестирования своего рабочего проекта на C# и selenium, я задумался о том, как будут выглядеть тест сценарии на одном из функциональных языков. Мой выбор пал на F#. Поискав, я наткнулся на очень интересный фреймворк под названием canopy, который базируется на всем известном selenium и полностью реализованном на языке F#. С первых же строк кода он произвел на меня впечатление своей простотой и минимализмом синтаксиса, который позволяет упрощать сложные вещи.
Читать дальше →
Всего голосов 21: ↑20 и ↓1+19
Комментарии3

Каких ответов я жду на собеседовании по тестированию

Время на прочтение15 мин
Количество просмотров909K
Я провожу собеседования на тестировщиков. У меня иногда болит голова.

Долго собирался написать статью… И вот, наконец, выполнил свое намерение. Вопросы, поднимаемые в статье, обсуждались уже не раз и не два, но усердные поиски компиляции ответов на эти вопросы так и не увенчались успехом. Но, как подсказывает мой опыт, такая компиляция очень нужна. Прежде всего она требуется юниорам, ибо в сети по запросу «тестирование» на них (соискателей) обрушивается огромный объем информационного мусора, который плохо структурирован и часто противоречит сам себе.
Читать дальше →
Всего голосов 64: ↑43 и ↓21+22
Комментарии70

Уменьшаем количество ошибок с помощью чек-листа Code Review

Время на прочтение3 мин
Количество просмотров31K
В нашей статье об эффективных ревью кода мы рекомендовали использовать чеклист. Чеклисты (контрольные списки) — это великая вещь в ревью: они гарантируют, что ревью действительно прошло через вашу команду. Также они способствуют выявлению и решению общих трудностей.

Исследование, проведенное Software Engineering Institute, показывает, что программисты делают 15-20 распространенных ошибок. Добавив такие ошибки в чеклист, вы можете быть уверены, что заметите их в момент появления и поможете от них избавиться надолго.

Чтобы вам было от чего отталкиваться, вот вам список типичных пунктов:
Читать дальше →
Всего голосов 26: ↑25 и ↓1+24
Комментарии13

Современный очень тихий компьютер

Время на прочтение2 мин
Количество просмотров8.1K
Мне надоел шум из под стола от системного блока. Реально иногда не хочется сидеть за компьютером только по причине того, что лишние децибелы терроризируют сознание. Ноутбук решил бы данную проблему, особенно на базе тихих энергосберегающих решений типа современного Pentium, но я предпочитаю мощный системник.

image

У меня сейчас не топовая, довольно старая конфигурация, но её производительность мне вполне подходит:
Intel Core 2 Duo E7500 2.93Ггц
8Гб DDR3 SDRAM
2Тб HDD Seagate 5900 Green

Я путём небольших вложений заставил-таки свой компьютер работать бесшумно.

Рассмотрим по отдельности все шумные узлы системного блока, такие как:
  • Видеокарта. Обычно наиболее шумный элемент
  • Процессор. Тоже не очень тихий узел системы
  • Блок питания. Также как правило содержит вентилятор
  • Прочее. Мало ли что там ещё гудит

Сразу же забегу вперёд, скажу, что водяное охлаждение в данной статье не рассматривается.
Читать дальше →
Всего голосов 96: ↑67 и ↓29+38
Комментарии167

Как правильно покупать товары на Ebay

Время на прочтение5 мин
Количество просмотров183K
image
Тема Ebay в связи с его русификацией становится очень актуальной, поэтому решил поделиться с хабрасообществом несколькими советами из области как правильно покупать товары на Ebay, чтобы не нарватся на мошенников и сделать правильную покупку. Большая часть описанного основана на личном опыте.
Читаем далее
Всего голосов 187: ↑166 и ↓21+145
Комментарии100

Теперь Google Analytics работает Асинхронно

Время на прочтение3 мин
Количество просмотров5.5K
Новый код выглядит вот так:
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview']);

(function() {
 var ga = document.createElement('script');
 ga.src = ('https:' == document.location.protocol ? 'https://ssl' :
   'http://www') + '.google-analytics.com/ga.js';
 ga.setAttribute('async', 'true');
 document.documentElement.firstChild.appendChild(ga);
})();

Это значит, что гугл.аналитикс больше не замедлит загрузку вашего сайта :)
UPD: То есть, он скачивал свой 24кб ga.js во время загрузки страницы, теперь он это может делать после…
Но после первой загрузки, он обычно закэширован и на всех остальных сайтах используется один и тот же :)

Материалы по теме:
Под катом бонус, код для русских поисковиков
Всего голосов 85: ↑73 и ↓12+61
Комментарии83

Полезняшка от Leadtek – Winfast VC100 U

Время на прочтение3 мин
Количество просмотров3.1K
Когда я только начинал писать обзоры, я и предположить не мог, что вот-вот и это станет моим хобби, а в последующем и интересной работой. Статейка за статейкой, коробка за коробкой…и вот, настал тот предсказуемый момент, когда стала ощущаться нехватка свободного места, куда можно было бы спрятать какие-нибудь коробки, инструкции, диски с драйверами и прочие невостребованные провода.

image

Немного дефрагментировав обстановку в комнате, я обнаружил одно злачное местечко – тумбочку, битком набитую старыми VHS-кассетами. «Ну погоди», «Сам себе режиссер», «КВН» — ну что тут еще сказать :) Думаю, многие меня поймут – вроде давно не нужно, но и выкидывать как-то жалко… Решение проблемы нашлось довольно быстро.
Читать дальше →
Всего голосов 81: ↑77 и ↓4+73
Комментарии109

Комментарии лесенками с ограничением вложенности

Время на прочтение1 мин
Количество просмотров545

Вкратце


#comments .c .c
{
margin-left: 20px;
}

#comments .c .c .c .c .c .c .c .c .c .c .c
{
margin-left: 0px;
}

Немного подробней


Иногда можно и не считать вложенность комментариев на сервере да не присваивать им свои классы типа indent_1, indent_2, indent_3 и так далее.
Всего голосов 23: ↑17 и ↓6+11
Комментарии30

Информация

В рейтинге
Не участвует
Откуда
Москва и Московская обл., Россия
Зарегистрирован
Активность