среда, 14 декабря 2016 г.

Кем занят порт?

For Yosemite (10.10) and El Capitan (10.11) and macOS Sierra (10.12):
sudo lsof -iTCP -sTCP:LISTEN -n -P

пятница, 9 декабря 2016 г.

Сравнение Flyway и Liquibase

http://stackoverflow.com/a/37411404/1499445

I already used both tools and so, in view, these are the main differences.
Flyway
  1. Easy to configure - you just need a folder location and keep a name syntax V1__file.sql,...
  2. SQL-based, but you need to write the right syntax of your specific database engine (Mysql, DB2,...)
  3. Is Java based so adding custom configuration to clean, execute etc. is easier.
Liquibase
  1. Need a main file "changelog" to keep track of all executed changesets.
  2. Is XML based, so you need to use specific liquibase tags to create SQL code. This is perfect to migrate your code to a different DB engine: you won't need to change anything, and just the DB driver will tell liquibase how to translate from XML tags to the right SQL syntax.
  3. If you use the sql tag from liquibase, then you won't take advantage of point 2, so it would be better to use Flyway instead.
  4. Liquibase provides a jar to migrate an existing DB to all needed XML files automatically, so you don't need to work manually on them. Quite useful.
Now it is up to you to decide what you need for your project, whether you need to migrate to a different DB engine in the future etc.

четверг, 8 декабря 2016 г.

Чем управляет dependencyManagement?

Секция управляет решением споров версий зависимостей, которые в проекте не явные, а подтянулись как зависимости зависимостей.

Dependency mediation очень часто не подходит как готовое решение зависимостей.

Dependency mediation - это механизм решения какую версию зависимости използьвать, если она непрямая, а находится в нескольких деревьях зависимостей прямых зависимостей. По этому механизму версия определяется той веткой, где зависимость находится ближе в иерархии.

Пример

Проект:
- Зависимость1
- Зависимость2

Зависимость1:
- Подзависимоть11 -> Подзависимоть111-> Общаязависимость(версия: 2)

Зависимость2:
- Подзависимоть21 -> Общаязависимость(версия: 1)


Значит в результате у нас в проекте окажется версия 1.


Иногда это совсем не подходит, и тогда и приходит на выручку секция:

<dependencyManagement<
....
</dependencyManagement>


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

Чудесная коцепция BOM ( bill of materials) - ведомость материалов. По которой мы в нашем проекте создаем артефакт типа pom, который содержит все версии артефактов, которые мы собираемся использовать по проекту(в разных его модулях). И такой артефакт мы указываем в в секции dependencyManagement под скоупом import(такой скоуп можно указывать только на артефакты pom). По сути BOM содержит только dependencyManagement секцию и не содержит секции dependencies - этот артефакт не приносит никаких реальных зависимостей, а только определяет версии для тех, которые мы будем подтягивать в наших модулях.




вторник, 20 сентября 2016 г.

Lifetime of session in Apache Tomcat

Session timeout hierarchy:

  • $tomcat_home/conf/web.xml 
  • $your_webapp/WEB-INF/web.xml 
  • manual invocation of HttpSession.setMaxInactiveInterval(int) 

<session-config>
    <session-timeout>5</session-timeout>
</session-config>

Each subsequent entry overrides others above.

Source

воскресенье, 11 сентября 2016 г.

Тонкости поиска в гугл

1. Слова в двойных кавычках. Ищется именно такая фраза/цитата без вариантов изменения слов и появления других слов между ними.
"Ой чий то кінь стоїть, що сива гривонька"


2. Если есть забытые слова в фразе, вместо них нужно ставить звездочку внутри кавычек между известными словами.
"Ой чий то кінь стоїть, що * гривонька"

среда, 7 сентября 2016 г.

Обнаружение проблем jvm с работающим приложением

Утилиты:
jps - показывает только JVM процессы, и команды, которыми они были запущены
jstat - получение статистики по работающему процессу: всевозможные опции по работе GC; работа класслоудера - что загружает, что выгружает (-class); JIT компиляция -compiler и -printcompilation  . Обычно неплохо получить несколько снимков за короткий промежуток времени, чтобы не снять тот, момент, когда злоумышлениик спрятался. Указываем pid промежуток времени в милисекундах между снимками и количество снимков.
jmap - делает снимок текущего состояния кучи.
jstack - делается снимок состояния текущего стектрейса приложения.
jhat - подымает http/html сервер, который выводит информацию по дампу в браузер, кроме того с помощью специального языка мы можем OQL(похож на sql) искать в дампе то что нам нужно




1) Шаг 1. Узнаем pid нашего приложения.
$ jps

2) Шаг 2 - снимаем jstack-том треддамп и находим нужные потоки для анализа по идентификаторам, которые мы запомнили с Шага 1.
$ jstack 24151 > stacktrace.log

3) Шаг 3.
$ top -Р
Видим потоки jvm отдельными(linux системные потоки). Замечаем, какие потоки едят процессорные мощности, запоминаем их идентификаторы.

4) Шаг 4.
Переводим в 16-ю систему айди тредов и ищем его в дампе - смотрим что с ним происходит.
$ grep -A30 0x5FB9 stacktrace.log

четверг, 25 августа 2016 г.

Показать скрытые файлы в Finder of Mac OS

 
defaults write com.apple.finder AppleShowAllFiles -bool true
killall Finder
Но лучше:) Command + Shift + '.' (Dot)

пятница, 22 июля 2016 г.

Удалить с JAR/WAR-ника ненужный файл

1) Найти к файлу путь в архиве:
 
$ jar tvf ROOT.war  | grep javax.inject
  2497 Tue Jun 28 05:26:26 CEST 2016 WEB-INF/lib/javax.inject.jar

2) Установить zip утилиту (yum install zip или apt-get install zip)

3) Удалить по ранее определенному пути
$ zip -d ROOT.war WEB-INF/lib/javax.inject.jar
deleting: WEB-INF/lib/javax.inject.jar

4) Убедиться, что файл удалился
$ jar tvf ROOT.war  | grep javax.inject
$ 

четверг, 14 июля 2016 г.

Oracle DB: Когда нужно к CLOB колонке в запросе применить DISTINCT

Нужно во вьюху тогда результаты конвертировать в текст, а потом применять DISTINCT:
select DISTINCT dbms_lob.substr(COL_OF_CLOB_TYPE, 32000, 1) from ...;

среда, 11 мая 2016 г.

"Распаковочные" операторы Python

*args - argument unpacking
**kwargs - keyword argument unpacking

Первый вариант распаковывает iterable в аргументы определенном порядке функции

args = (1, 2, 3)  # usually a tuple, always an iterable*

f(*args) → f(1, 2, 3)

А вот распаковывается mapping в аргументы по ключевым словам
kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(1, 2, 3) # if you have `def f(a=0, b=0, c=0)`

вторник, 10 мая 2016 г.

Работающий маунт на Mac OS El Capitan

sudo mount -t nfs -o resvport,rw 192.168.11.175:/home/data /Users/aieremenko/pr/pap/liferay-portal-6.2-ee/data

понедельник, 18 апреля 2016 г.

Gradle. Работа с файловой системой.

Для работы с файловой системой мы используем типизированные задачи:
Бывают:
- copy
- zip
- delete


task copyJpegs(type: Copy) {
   from images
   include '*.jpg'
   into 'build'
}

task copyImageFoders(type: Copy) {
   from('images') {
      include '*.jpg'
      into 'jpeg'
   }
   from('images') {
      iclude '*.gif'
      into 'gif'
   }

   into 'build'
}

task zipImages(type: Zip) {
   baseName = 'images'
   destinationDir = file('build')
   from 'images'
}

task zipImageFolders(type: Zip) {
    baseName = 'images'
    destinationDir = file('build')

    from('images') {
        include '*.jpg'
        into 'jpeg'
    }

    from('images') {
        include '*.gif'
        into 'gif'
    }
}

task deleteBuild(type: Delete) {
    delete 'build'
}

task unpackBundle(type: Copy) {
    from zipTree('build/web.zip')
    into 'build/exploded'
}

Зависимости тасков Gradle

dependsOn - запускается сначала указанный/ые здесь
finalizedBy - запускается после таска указанный здесь
mustRunAfter - выстраивает порядок тасков: сначала указанный, потом текущий, вне зависимости от порядка указанного при запуске
shouldRunAfter - это менее строгий вариант предыдущего, порядок желательный, но есть два варианта, когда он нарушается: 1) когда используется правило, в котором предствлено упорядоченный цикл; 2) когда запускаются таски в паралельном режиме

myTask.onlyIf(new Spec() {
   boolean isSatisfiedBy(Task task) {
      return task.dependsOnTaskDidWork();
   }
});

четверг, 14 апреля 2016 г.

Основы Gradle

Ядро Gradle - это язык для программирования основанном на зависимостях: мы можем определять задачи и зависимости между ними.

Любой build.gradle скрипт делегирует свое тело в обьект project.
То есть
task myTask1 << {}
По сути:
project.task("myTask1", { doLast {}})
А теперь плавный переход от последнего к первому, чтобы было понятно, как такое может быть. Шаг1
task("myTask1", { doLast {}})
Шаг2
task "myTask1" { doLast {}} 
Шаг3
task myTask1  << doLast {}
Все по правилам груви + понимание того, что скрипт всегда выполняется в контексте глобального обьекта project.

Кроме того, project умеет искать среди своих тасков, если идет обращение не к его предопределенным полям/методам. Из-за этого мы можем обращаться к таске так:
myTask.description="My description"
myTask.group="Some group"
myTask.doLast({println "Do it last"}) 
myTask.doFirst {println "Do it first"}
myTask.leftShift {println "Do this even more last"} //leftShift is a method in groovy Object which provides possibility to execute provided closure when applying operator << for instance of the class. Этот метод таски считается алиасом doLast.
myTask << {println "Do this last of all"} //leftShift can be also defined by opertor << 
Методы do* не перегружают предыдущие замыкания, а добавляют в очередь, которая выполняется по порядку.

У обьекта project есть поле tasks, которое является списком, внутри которого все таски проекта.

Наиболее распространенный шаблон для создание простой таски, это создание и немедленная передача замыкания через оператор << в список действий doLast фазы;

task myTask2 << {
   println "Do it last"
}

Как можно было уже заметить, настраивать таску можно не через вызовы методов, а через замыкание настроек
task("myTask3", {
 description "Some"//this calls setter setDescription("Some")
 group="Some group"//this also callss setter, but we need always use = for collections
 doLast({println "Do it last"}) 
 doFirst {println "Do it first"}
 leftShift {println "Do this even more last"}
})
Или же все по сахарному, как и должно это писаться:
task myTask3 {
 description "Some"
 group "Some group"
 doLast {println "Do it last"}  
 doFirst {println "Do it first"}
 leftShift {println "Do this even more last"}
}

Некоторые свойста мы можем установить через декларацию таски, но так мы можем установить не все
task myTask3(description: "Some") << {println "Do it last"}
Единственное где мы обязанны пользоваться, только такой установкой свойства, это типизированная таска.

Визуализация алгоритмов

Когда срабатывают static в java


class A {
    private static int v = func();
    private static int func() {
        System.out.print("A");
        return 0;
    }
}

class B {
    private static int v = func();
    public static int func() {
        System.out.print("B");
        return 0;
    }
}

class C {
    private static int v = func();
    public static int func() {
        System.out.print("C");
        return 0;
    }
}

class Question {
    public static void main(String[] args) {
        B b;
        C.func();
        b = new B();
        System.out.println();
    }
}

Вывод будет: CCB

Почему так? Из спецификации:
Класс Т инициализируется в одном из следующий 5 случаев:
1. Создается объект класса Т.
2. Вызывется статичный метод класса Т.
3. Статичной переменной класса Т присваивается значение (вне класса).
4. Статичная (не константная) переменная класса Т используется.
5. Т - внешний класс и внутри него выполняется конструкция assert.

Таким образом первое упоминание класса В не запускает инициализацию класса.

пример взят из http://www.quizful.net/

понедельник, 28 марта 2016 г.

Снести очереди Rabbitmq в работающей среде

1) Отгородиться от пользователей, потому что удалить очереди для открытых соединений нельзя:
$ iptables -I INPUT  -p tcp --dport 5672 -j DROP
$ rabbitmqctl list_connections pid port state user vhost recv_cnt send_cnt send_pend name | awk '{print "rabbitmqctl close_connection \"" $1 "\" \"manually closing idle connection\"" | "/bin/bash" }'

2) Удалить очереди:
$ rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done

3) Вернуть миру Rabbitmq
3.1. Узнать на какой строке живет правило блокировки входящих пакетов на реббит:
iptables -L INPUT -n --line-numbers
3.2. Удалить это правило:
iptables -D INPUT [LINE_NUMBER]

iptables статьи вроде коротко и понятно

Нужно наконец-то это выучить:)
http://vasilisc.com/21-examples-iptables
http://www.k-max.name/linux/netfilter-iptables-v-linux/

четверг, 24 марта 2016 г.

Узнать на Linux количесто процессоров/ядер

$ cat /proc/cpuinfo
$ lscpu

Подключить сетевой диск в Mac OS


sudo mount -t nfs -o resvport,rw 192.168.11.175:/home/data /Volumes/pap_doclib

Чтобы он подключался на стартапе нужно произвести манипуляции


/path/to/scripts/mount_disk.sh
#!/bin/sh
mkdir /Volumes/pap_doclib
sudo mount -t nfs -o resvport,rw 192.168.11.175:/home/data /Volumes/pap_doclib


/Library/LaunchDaemons/com.coreer.mount_disk.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.coreer.mount_pap_doclib</string>
    <key>Disabled</key>
    <false/>
    <key>UserName</key>
    <string>aieremenko</string>
    <key>ProgramArguments</key>
    <array>
      <string>/path/to/scripts/mount_disk.sh</string>
    </array>
    <key>KeepAlive</key>
    <dict>
      <key>SuccessfulExit</key>
      <false/>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <false/>
  </dict>
</plist>


Запуск не дожидаясь перегрузки:
sudo launchctl load /Library/LaunchDaemons/com.coreer.mount_disk.plist

среда, 23 марта 2016 г.

Понятие Quality of Service на примере протокола MQTT

QoS

MQTT is designed to work well on unreliable networks and as such provides three levels of Quality of Service for different situations. These allow clients to specify the reliability they desire.

QoS Level 0:

The simplest level of QoS, it requires no acknowledgment from the client and the reliability will be the same as that of the underlying network layer, TCP/IP.

QoS Level 1:

This ensures that the message is delivered to the client at least once, but it could be delivered more than once. It relies on the client sending an ACK packet when it receives a packet. This is commonly used for guaranteed delivery however developers must make sure that their systems can handle duplicate packets.

QoS Level 2:

This is the least common QoS, and ensures that a message is delivered once and only once. This method requires an exchange of four packets, and will decrease performance of the broker. This level is also often left out of MQTT implementations due to its relative complexity. Make sure you check this before choosing a library or broker.


Протокол AMQP

Advance Messaging Queuing Protocol - протокол уровня приложения(на ряду HTTP, SSH, LDAP), который позволяет обмениваться сообщениями между подмодулями системы или даже между разными приложениями, работа происходит через посредник-брокер, который умеет маршрутизировать, создавать очереди, подписывать клиентов на определенный тип сообщений.
Был написан как стандартизирующее обьединение протоколов JMS(jvm) и NMS(.net).

В его основе лежит три основных понятия:
1) Сообщение (message) - вольного содержания, но может содержить также предопределенные заголовки.
2) Точка обмена (exchange) - сюда присылаются сообщения клиентами, сообщения распределяются в очередя, сообщение в зависимости от условий может попадать или в одну очередь или в несколько, сообщения не хранятся в точках обмена они хранятся только в очередях. Клиенты забирают свои сообщения из очередей. Точки обмена есть трех типов:
    - fanout - такой ексчендж размножает сообщения во все присоединенные к нему очередя, обеспечивая таким образом клоны очередей;
   - direct - сообщение попадает в очередь с именем совпадающим с ключем маршрутизации(routing key) сообщения;
   - topic - к ключам маршрутизации применяется некие маски-правила которые привязаны к очередям, таким образом ексчендж ведет себя как fanout, но при этом каждая очередь имеет определенный фильтр, позволяющий толи принимать, толи отвергать присланное сообщение.
3) Привязка(binding) - именно эта штука привязывает конкретную очередь к конкретному типу точки обмена, обьявляя фильтры под которые конкретное сообщение будет подходить для попадания в очередь.
4) Очередь (queue) - хранилище сообщений для клиентов, сообщения пропадают из очереди после того как клиет забирает его, клиенты могут кормиться на нескольких очередях.
Могут быть нескольких типов:
 - классические;
 - round-robin (несколько приложений подымаются и обьявляют одну и ту же очередь для потребления(по сути это одно приложение с которого создается несколько процессов, которые выполняют одну и ту же задачу), таким образом все они будут потреблять с нее. В эту очередь приходят сообщения, которые запускают долгоирающие задачи в потребителях, таким образом, первый кто свободен и берет на себя выполнение задачи, по скольку их много задачи не залеживаются, а решаются клонами-воркерами паралельно);
 - store;
 - forward


Путевое объяснение на сайте RabbitMQ - реализация протокола.

AMQP вспомнить по картинке принцип работы


вторник, 8 марта 2016 г.

Анализ JVM Thread Dumps and Heap Dumps

http://www.eclipse.org/mat/
http://javaeesupportpatterns.blogspot.com/2011/09/gc-overhead-limit-exceeded-java-heap.html

вторник, 23 февраля 2016 г.

Mac OS X several JDKs management

http://www.jenv.be/
~/.java_version - file with current jdk version
~/.jenv/ - место обитания утилиты

Agile Testing Training

https://www.browserstack.com/

1)  Gantt Chart

2) Appium?

3) Feature flag for apple on BE to provide to an user some new feature.

4) Spike(from XP Methodology) - технологическое исследование.

Project Manager  - time scheduling
Product Manager - Backlog management

P1 - Minimum Version of Product
QAssurance =/= Tester(QAssistent)

Sprint0 - tools configuration; preparation; infrustrure work

chef - [шеф])))

Sprint1- if you gonna to calculate velocity then this is the place for it.

gone chart

story point - relational point for estimation. В них оцениваются юзер стори(это и BE+FE+testing)


Velocity of team

Story points
^
|     x
|            x
|                  x    x
|                               x
|___1__2__3__4__5__x6________> Time (days)

Если тестирование влияет на количество стори поинтов, то это означает что разработчики не считают тестировщиков частью комманды.



Task |    Todo   |   In Progress   |  Review (Code review of "ready" task) | Verify(Testing)  | Done
1       |    1d       |    2d                 |                              0.5d                          |    0.5day              |  .....

"Как мы будем это тестировать?" - задавать на этапе планирования по каждой задаче и не переходить дальше пока ответ не будет дан.


jUnit sources - good example of good code:)


End to end tests (UI) - only "Happy flow"(registration, payment) should be covered.
Integration tests
Componental tests (Mocked BE so we check only UI(FE) layer; concentrated testing of concrete layer).
Unit tests


Build should be no more than 30 minutes.

Книга: Эляху Голдрейд "Цель", "Цель 2"


Ice-cream antipattern - перевернутая пирамида тестов.

Еще нужно понимать, что тесты всегда несут в нагрузку время на поддержку, потому что требования изменяются.

Автоматизация.

Рекордеры подходят для оптимизирования маннуальных тестов(тестить больше), но не для автоматических тестов.

Robotium(testdroid)

Qtp
https://saucelabs.com/


PixelPerfect - AppLitools - для соответсвия визуалкам.

http://www.sikuli.org/testing.html - план Б, если нет локатора, чтобы достать это силениумом.

https://www.getpostman.com/


Sniffers can be used for gathering data for mocks for Components testing.



xPath works in Chrome Devtools in search box



Test Strategy

Tests criterias should be the first...

Эвристика - менатльный иснтрумент Джеймса Баха? абстрактный подход, который помогает находить правильную тестовую стратегию. Цель создания - ответ навопрос "как начинать дискусию?" -> собираем контекст.

Structure
Function
Data
Platform
Operations(user stories)


преимущество эвристики по сравнению с шаблонами - гибкость.

Эвристическая модель тестовой стратегии.


Quality criteria:                                        
 like: testibility of system;                            
 time to fix some defect should be  X days  


требования для производительности было бы не плохо залаживать в самом начале разработки архитектуры системы.

https://www.pagerduty.com/ - система для мониторинга продакшина

http://www.satisfice.com/tools/htsm.pdf


Project Environment


Product Elements


Исследовательское тестирова vs скриптовая тестировка

xMind

http://goo.gl/omLwqS - good site for train testing skills (there are enough bugs)

Тестовая сессия подразумевает фокуссировку на тестируемую фичу.
Но бывают и сессии расфокусирования, чтобы находить неявный/скритые/и т.д. баги.

http://www.getzephyr.com/



graphwalker.org(state transition diagram) Model Based Testing - alternative to Gerkin for large and long application.

Gerkin - short, medium project
MBT - long large project.


Баг можно не заводить если он будет пофикшен в течении 30 минут.


bug triage meaning - расстановка приоритетов накопившимся багам.
http://tim-richardson.net/joomla15/tech-articles-list-techmenu-71/76-definition-of-a-bug-triage.html

http://scrumguides.com.ua/articles/uhod-za-beklogom-gruming-ili-kak-sdel/

https://www.owasp.org/index.php/Main_Page

http://www.thucydides.info/

http://software-testing.ru/forum/index.php?/topic/12806-printcipialnaia-raznitca-mezhdu-severity-priority/


https://developers.google.com/protocol-buffers/
https://github.com/google/protobuf



"triton shoes"


Эвристики:
Past
Results
Obstacles
Outlook
Feelings (smiles)




Watcher in jira for new commer


Defect Prevention Strategy
Этап планирования
1) critical questions.
2) focusing the team on the testability
3) test types.
4) engineering tools
5) prototypes, mocks
6) acceptance criteria
7) test environment, data

Этап реализации
1) Тестировать как можно раньше
2) Разработка всей командой вместе на старте(один кодит все советуют - команда должна быть приблизительно одного уровня)
3) Автоматизация тестирования.
4) Углубляться в детали(разумно).


Test Heuristics Cheat Sheet
http://testobsessed.com/wp-content/uploads/2011/04/testheuristicscheatsheetv1.pdf

https://chrome.google.com/webstore/detail/bug-magnet/efhedldbjahpgjcneebmbolkalbhckfi

Tree roles:
Tester
Reporter
Observer


Check Lists vs Test Cases

Yandex QA tools http://qatools.ru/
https://github.com/yandex-qatools

performance test - common visiting
load test - high visiting
stress test - to know critical values(when we know maximum than we can stop accepting new requests after hitting some limit)

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

https://archive.org/web/











среда, 17 февраля 2016 г.

Jersey test util features

Jersey предлагает неплохие тулзы для тестирования.
Единственное что они подымают реальный контейнер для запуска сервлеты сервера
org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory$GrizzlyTestContainer
что занимает определенное время... Но это можно пережить.

Необходимы классы вот:
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.spring.SpringLifecycleListener;
import org.glassfish.jersey.test.JerseyTest;

Первая група это просто классы для работы с JAX-RS по спецификации.
А вот вторая уже стыковка со спрингом(если он у нас для поддержания контекста зависимостей) и уже JerseyTest класс, который мы расширяем для магии
public class MyRestResourceTest extends JerseyTest {

    @Override
    protected Application configure() {
   ResourceConfig appConfig = new ResourceConfig(MyRestResource.class);
   appConfig.register(SpringLifecycleListener.class);
   appConfig.property("contextConfigLocation", "file:src/main/webapp/WEB-INF/spring/root-context.xml");
   return appConfig;
    }
    
    @Test
    ........
}
Расширение этого класса позврояет нам пользоваться методом, который дарует возможность запросов на сервер:
public class MyRestResourceTest extends JerseyTest {
    ........
    
    @Test
    public void testSomeGet() throws Exception {
        final Response resp = target().path("/somepath")
    .request(javax.ws.rs.core.MediaType.APPLICATION_JSON)
                                .get();
        assertThat(resp.getStatus(), is(200));
        String someJsonForParsing = response.readEntity(String.class);
        ...        
    }
    ........
}
Ну и чего-нибудь отправим:
public class MyRestResourceTest extends JerseyTest {
    ........
    
    @Test
    public void testSomePost() throws Exception {
        Form form = new Form() ;
        form.param("param1", "value");
        final Response resp = target("path/for/post").request(javax.ws.rs.core.MediaType.APPLICATION_JSON)
          .post(Entity.entity(form, "application/x-www-form-urlencoded"));
        assertThat(resp.getStatus(), is(200));
        String someJsonForParsing = response.readEntity(String.class);
        ...        
    }
    ........
}

вторник, 16 февраля 2016 г.

jUnit Theories for generating test inputs

https://dzone.com/articles/building-custom-datapoints

понедельник, 15 февраля 2016 г.

Миф мультизадачности

http://blog.codinghorror.com/the-multi-tasking-myth/

понедельник, 8 февраля 2016 г.

RESTful levels

REST Maturity Model

Richardson created the REST Maturity model which specifies whether an API is “fully RESTful”. Most are not, and don’t necessarily have to be. But here is a rundown:

Level 0 - XML-RPC / SOAP

  • One URI
  • One HTTP Method
Level 0 is a very basic model where you simply sent an RPI (Remote Procedure Invocation) at a web site and it returns some data. It can be in XML, JSON, or any format with key-value pairs.

Level 1 - Add URIs

  • Many URIs / Resources
  • One HTTP Method
Level 1 is similar except now there are multiple resources in use:
http://www.yoursite.com/api/products/1234
http://www.yoursite.com/api/customers/0037

Level 2 - Add HTTP

  • Many URIs/Resources
  • Use of HTTP Verbs
In level 2 we add HTTP verbs: GET,POST,PUT,DELETE. There are others, but these four I will describe later.

Level 3 - Add HATEOAS

  • Many URIs/Resources
  • Use of HTTP verbs
  • Hypermedia
In this level we add HATEOAS: Hypertext As The Engine Of Application State. This is how we send objects, but also some instructions in the reply describing what we can do next. For example, it may return something like this:
xml version="1.0"?>
<account>
   <account_number>12345</account_number>
   <balance currency="usd">100.00</balance>
   <link rel="deposit" href="/account/12345/deposit" />
   <link rel="withdraw" href="/account/12345/withdraw" /> 
   <link rel="transfer" href="/account/12345/transfer" />
   <link rel="close" href="/account/12345/close" />
 </account>
(from Wikipedia)
These hypermedia controls mean the REST client does not need to know how to use the service and instead can be guided by the responses. This is what is considered a “fully RESTful” service.

понедельник, 25 января 2016 г.

Вывод стектрейса из кода в Java

for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
            System.out.println(ste);
        }

понедельник, 18 января 2016 г.

JDK 1.8 LocalDateTime to JDK 1.0 Date

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

...

final LocalDateTime now = LocalDateTime.now();
final Date oldNow = Date.from(
                now.atZone(ZoneId.systemDefault()).toInstant()
        );

четверг, 14 января 2016 г.

SerenityBDD

Интересненько http://www.thucydides.info/