Nerrvana в работе – заключение

Using Nerrvana - final notes

Тестирование приложения с двумя базами данных – конфигурационные файлы “как есть” – дальнейшие планы

Part 1 – Nerrvana в работе – как это делается у нас
Part 2 – Nerrvana в работе – SVN втыкается в Jenkins
Part 3 – Nerrvana в работе – сборка приложения и Jenkins (часть 1)
Part 4 – Nerrvana в работе – сборка приложения и Jenkins (часть 2)
Part 5 – Nerrvana в работе – настройка Jenkins для Selenium тестирования
Part 6 – Nerrvana в работе – заключение – этот пост

К этому моменту мы рассказали о том, как мы тестируем свои приложения при помощи Jenkins и Nerrvana. В нашем рассказе некоторые детали были намеренно опущены, дабы не усложнять описание сути процесса.

Пришло время показать реальные файлы конфигурации.

Вот скрипт publish.sh. Как вы видите, в нём не одна секция, как было показано ранее, а две. Одна занимается распаковкой и настройкой на deployment-хосте приложения Answers для работы с MySQL, а другая – с PostgreSQL.

#!/bin/sh
 
WWW_MYSQL_DIR='/var/www/answers/answers_mysql'
WWW_PGSQL_DIR='/var/www/answers/answers_postgres'
DB_NAME='answers'
 
rm -Rf $WWW_PGSQL_DIR/*
unzip -o prj.zip -d $WWW_PGSQL_DIR
mv $WWW_PGSQL_DIR/config/Settings.class.php.pgsql $WWW_PGSQL_DIR/config/Settings.class.php
chmod -R 777 $WWW_PGSQL_DIR
psql -U postgres -f $WWW_PGSQL_DIR/install/crt-pgsql.sql
psql -U postgres -f $WWW_PGSQL_DIR/install/postgres.sql $DB_NAME
 
rm -Rf $WWW_MYSQL_DIR/*
unzip -o prj.zip -d $WWW_MYSQL_DIR
mv $WWW_MYSQL_DIR/config/Settings.class.php.mysql $WWW_MYSQL_DIR/config/Settings.class.php
chmod -R 777 $WWW_MYSQL_DIR
mysql -v -u root  < $WWW_MYSQL_DIR/install/crt-mysql.sql
mysql -v -u root  < $WWW_MYSQL_DIR/install/mysql.sql $DB_NAME

Вот как выглядит наш build.xml. Фактически то же самое, что и показывали ранее, но добавились аналогичные MySQL действия для PostgreSQL (строки 13-14, 22-23 и 35-36).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?xml version="1.0" encoding="UTF-8"?>
<project name="${env.JOB_NAME}" default="build" basedir=".">
  <property environment="env"/>
  <property name="tests" value="${env.WORKSPACE}/tests"/>
  <property name="ci" value="${env.WORKSPACE}/ci"/>
  <property name="code" value="${env.WORKSPACE}/code"/>
 
 
  <target name="make_settings">
      <exec executable="sed" output="${code}/config/Settings.class.php.mysql">
        <arg 
            line="-f ${ci}/deployment/config/mysql/settings-mysql.sed ${code}/config/Settings.class.template.php"
        />
      </exec>
      <exec executable="sed" output="${code}/config/Settings.class.php.pgsql">
        <arg 
            line="-f ${ci}/deployment/config/pgsql/settings-pgsql.sed ${code}/config/Settings.class.template.php"
        />
      </exec>
    </target>
 
  <target name="make_sql">
    <exec executable="sed" output="${code}/install/mysql.sql">
      <arg 
           line="-f ${ci}/deployment/config/mysql/install-mysql.sed ${code}/install/mysql.sql"
      />
    </exec>
    <exec executable="sed" output="${code}/install/postgres.sql">
      <arg
          line="-f ${ci}/deployment/config/pgsql/install-pgsql.sed ${code}/install/postgres.sql" 
      />
    </exec>
  </target>
 
  <target name="move_files" depends="make_settings,make_sql">
    <!-- Move authentication files to WAUT root -->
    <move file="${ci}/deployment/misc/login.php" tofile="${code}/login.php" />
    <move file="${ci}/deployment/misc/logout.php" tofile="${code}/logout.php" />
 
    <!-- Move MySQL db creation files to install folder -->
    <move
         file="${ci}/deployment/config/mysql/crt-mysql.sql"
         tofile="${code}/install/crt-mysql.sql"
    />
 
    <!-- Move PGSQL db creation files to install folder -->
    <move 
         file="${ci}/deployment/config/pgsql/crt-pgsql.sql" 
         tofile="${code}/install/crt-pgsql.sql" 
    />
 
    <!-- Move publish script to the workspace root, so it will be beside prj.zip -->
    <move 
         file="${ci}/deployment/publish-over-ssh/publish.sh"
         tofile="${env.WORKSPACE}/publish.sh"
    /> 
  </target>
 
  <target name="save_commit_info" depends="move_files">
      <!-- Temp fix for SVN client and SVN plugin incompatibility -->
      <exec dir="${env.WORKSPACE}" executable="svn" >
          <arg 
              line="--username jenkins --password 123456 upgrade"
          />
      </exec>
      <exec dir="${env.WORKSPACE}" executable="svn"  output="${env.WORKSPACE}/version.txt">  
          <arg line="--username jenkins --password 123456 log -r ${env.SVN_REVISION}" />
      </exec>
      <exec dir="${env.WORKSPACE}" executable="svn">  
          <arg line="--username jenkins --password 123456 log -r ${env.SVN_REVISION}" />
      </exec>          
  </target>	
 
  <target name="svn" depends="save_commit_info">
      <java
           dir="."
           jar="${ci}/deployment/scm-decorator.jar"
           fork="true"
           failonerror="true"
      >
 
          <arg value="svn"/>
          <arg value="${env.WORKSPACE}/version.txt"/> 
      </java>    	
  </target>
 
  <target name="zip" depends="svn" description="Compress project files">
      <jar destfile="${env.WORKSPACE}/prj.zip"
            basedir="${env.WORKSPACE}/code"
            excludes=".svn" />
  </target>
 
  <target name="build" depends="zip" />
</project>

На конфигурационной странице плагина Nerrvana добавлен ещё один build шаг. То есть сначала тестируем приложение под MySQL, а потом – под PostgreSQL. Чем отличаются настройки этих шагов build-а?

Во-первых, они используют разные имена для создания Test Run-ов и разные исполняемые файлы.

С именами всё понятно – они должны отличаться. Вот как выглядят результаты тестирования после запуска build-a, когда приложение тестировалось с двойным вызовом плагина Nerrvana. Сразу понятно, что есть что.

Я не говорил о том, куда же стучатся тесты. URL прописан непосредственно в build-файле Ant уже самих тестов. Мы просто не касались этой темы. Есть два build.xml, и в каждом из них прописан URL на соответствующий виртуальный хост для Answers, работающих с MySQL и с PostgreSQL соответственно.

То есть, например, xbuild-mysql.sh используется для запуска тестов приложения, работающего с MySQL. Его содержимое:

ant -f build-mysql.xml all > build.log 2 >& 1

build-mysql.xml в свою очередь внутри себя делает:

<copy file="${resources}/config-mysql.xml" tofile="${output}/config.xml"/>

А вот уже в файле config-mysql.xml мы увидим и какие тесты запустятся, и какой URL будет использоваться.

<properties>
    <entry key="suite-title">Answers Test Suite</entry>
    <entry key="tests-disabled">
        com.deepshiftlabs.testui.AnswersStartyCo. TestLogin,
        com.deepshiftlabs.testui.AnswersStartyCo.TestAddRemoveQuestionByAnonymous,
        com.deepshiftlabs.testui.AnswersStartyCo.TestAddRemoveQuestionByUser,
        com.deepshiftlabs.testui.AnswersStartyCo.TestSearch,
        com.deepshiftlabs.testui.AnswersStartyCo.TestReply,
        com.deepshiftlabs.testui.AnswersStartyCo.TestFilterSort,
        com.deepshiftlabs.testui.AnswersStartyCo.TestTags,
        com.deepshiftlabs.testui.AnswersStartyCo.TestSmoke,
    </entry>
 
    <entry key="website">http://answers.dslabs.lan/mysql</entry>

Видно, что сейчас отключены все тесты кроме TestLogin.

Во-вторых, в первом вызове плагина мы синхронизируем тесты с Nerrvana, а во втором уже нет, так как это один и тот же код. Это экономит нам время. Ещё вы видите, что в первом шаге, тестирующем MySQL, отключен анализ сообщений, а во втором – наоборот, включен. Таким образом, мы даём тестам закончиться на обоих хостах и только потом анализируем сообщения.

Отчёт, подготовленный плагином на основе анализа сообщений, составлен с учётом того, что плагин был запущен два раза и содержит две секции.

Наконец, под спойлером вы найдёте пример консольного лога такого двойного выполнения (я немного подсократил серединки выводов некоторых команд)

Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/Answers/workspace
Cleaning local Directory .
Checking out http://192.168.3.97/repos/answers/trunk at revision 146
A         tests
----------- SOME LINES REMOVED ---------------------------------
A         ci/toolchain/build-toolchain.xml
At revision 146
[deployment] $ ant -file build.xml build
Buildfile: build.xml
 
make_settings:
 
make_sql:
 
move_files:
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code/install
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace/code/install
     [move] Moving 1 file to /var/lib/jenkins/jobs/Answers/workspace
 
save_commit_info:
     [exec] Upgraded '.'
----------- SOME LINES REMOVED ---------------------------------
     [exec] Upgraded 'ci/deployment/misc'
     [exec] Upgraded 'ci/toolchain'
     [exec] ------------------------------------------------------------------------
     [exec] r146 | igork | 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012) | 1 line
     [exec] 
     [exec] "Fixed" robots.txt to initiate Jenkins build
     [exec] ------------------------------------------------------------------------
 
svn:
 
zip:
      [jar] Building jar: /var/lib/jenkins/jobs/Answers/workspace/prj.zip
 
build:
 
BUILD SUCCESSFUL
Total time: 0 seconds
SSH: Connecting from host [phpbb.deepshiftlabs.com]
SSH: Connecting with configuration [Answers test server] ...
SSH: EXEC: STDOUT/STDERR from command [chmod +x publish.sh
./publish.sh] ...
Archive:  prj.zip
   creating: /var/www/answers/answers_postgres/META-INF/
  inflating: /var/www/answers/answers_postgres/META-INF/MANIFEST.MF  
   creating: /var/www/answers/answers_postgres/config/
   creating: /var/www/answers/answers_postgres/include/
----------- SOME LINES REMOVED ---------------------------------
   creating: /var/www/answers/answers_postgres/utils/
  inflating: /var/www/answers/answers_postgres/ask.php  
----------- SOME LINES REMOVED ---------------------------------
  inflating: /var/www/answers/answers_postgres/utils/DBUtils.class.php  
  inflating: /var/www/answers/answers_postgres/utils/Utils.class.php  
  inflating: /var/www/answers/answers_postgres/utils/init.php  
DROP DATABASE
CREATE DATABASE
REVOKE
DROP ROLE
You are now connected to database "answers".
psql:/var/www/answers/answers_postgres/install/crt-pgsql.sql:7: NOTICE:  table "USERS_SOURCE_TABLE" does not exist, skipping
DROP TABLE
psql:/var/www/answers/answers_postgres/install/crt-pgsql.sql:17: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "users_source_table_pkey" for table "users_source_table"
CREATE TABLE
INSERT 0 1
INSERT 0 1
----------- SOME LINES REMOVED ---------------------------------
GRANT
Archive:  prj.zip
   creating: /var/www/answers/answers_mysql/META-INF/
  inflating: /var/www/answers/answers_mysql/META-INF/MANIFEST.MF  
   creating: /var/www/answers/answers_mysql/config/
   creating: /var/www/answers/answers_mysql/include/
----------- SOME LINES REMOVED ---------------------------------
   creating: /var/www/answers/answers_mysql/utils/
  inflating: /var/www/answers/answers_mysql/ask.php  
----------- SOME LINES REMOVED ---------------------------------
  inflating: /var/www/answers/answers_mysql/utils/DBUtils.class.php  
  inflating: /var/www/answers/answers_mysql/utils/Utils.class.php  
  inflating: /var/www/answers/answers_mysql/utils/init.php  
--------------
drop database answers
--------------
 
--------------
create database answers
--------------
 
--------------
DROP TABLE if exists USERS_SOURCE_TABLE
--------------
 
--------------
CREATE TABLE `USERS_SOURCE_TABLE` (
  USERS_ID_COLUMN int(11),
  username varchar(50),
  USERS_DISPLAY_NAME_COLUMN varchar(50),
  USERS_EMAIL_COLUMN varchar(50),
  CONSTRAINT USERS_SOURCE_TABLE_pkey PRIMARY KEY (USERS_ID_COLUMN)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
--------------
 
----------- SOME LINES REMOVED ---------------------------------
 
--------------
CREATE VIEW `USERS_VIEW_NAME` AS
  SELECT
    `USERS_ID_COLUMN` AS `USERS_ID_COLUMN`,
    `USERS_DISPLAY_NAME_COLUMN` AS `USERS_DISPLAY_NAME_COLUMN`,
    `USERS_EMAIL_COLUMN` AS `USERS_EMAIL_COLUMN`
  FROM
    `USERS_SOURCE_TABLE`
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_users TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_answers TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_questions TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_tags TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_tags_to_quest TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_subscribers TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES_PREFIX_votes_a TO 'ANSWERS_DB_USER'@localhost
--------------
 
--------------
GRANT SELECT ON USERS_VIEW_NAME TO 'ANSWERS_DB_USER'@localhost
--------------
 
SSH: EXEC: completed after 1,003 ms
SSH: Disconnecting configuration [Answers test server] ...
SSH: Transferred 2 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
2012-11-14 08:22:49 
 
---BEGIN PLUGIN EXECUTION---
2012-11-14 08:22:49 ---INITIALIZATION STARTED---
2012-11-14 08:22:49 
---BEGIN PLUGIN SETTINGS---
	Nerrvana HTTP address: https://api.nerrvana.com
	Nerrvana API key: 2bf7c81-a031f-1ad2-fd3a6-f59b9e0668e
	Secret key:  wctfFwelygx3tXS4TasrsOS4oXV7YadcPppvEnx55WG7qPk6jrAHjJi1TRoLlhrarIlabte4H9zWROXVkLnXto2LlVC47EXx91Uu
	Space ID: 4144
	Space: Answers
	Space path[FTPS folder]: Answers/_files
	Selenium nodes per platform: 1
	Test run name: Answers TRUNK MySQL
	Nerrvana platforms:
		Opera 12.02 (WinXP)
		Firefox 15.0 (WinXP)
	Executable file: xbuild-mysql.sh
	Nerrvana FTPS address: ftp.nerrvana.com
	Nerrvana FTPS user: demo154
	Nerrvana FTPS pass: dem0l54
	Workspace folder: ./tests
	Max execution time: 3600
	Poll period: 20
	Parse user messages mode[results analyzer]: OFF
-----END PLUGIN SETTINGS---
2012-11-14 08:22:49 -----INITIALIZATION COMPLETED---
 
2012-11-14 08:22:49 Generated test run name: Answers TRUNK MySQL build #55
2012-11-14 08:22:49 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
"Fixed" robots.txt to initiate Jenkins build
 
2012-11-14 08:22:49 ---BEGIN UPLOADING TESTS TO NERRVANA FTPS---
[workspace] $ lftp -f upload-build-55-1352863447229969289.ftp
2012-11-14 08:23:22 -----END UPLOADING TESTS TO NERRVANA FTPS
 
2012-11-14 08:23:25 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:23:25 New test run ID#952.
2012-11-14 08:23:25 New execution ID#5769.
2012-11-14 08:23:25 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:23:47 	Current execution status: run
 
2012-11-14 08:24:09 	Current execution status: run
 
----------- SOME LINES REMOVED ---------------------------------
 
2012-11-14 08:26:42 	Current execution status: run
 
2012-11-14 08:27:04 	Current execution status: ok
 
2012-11-14 08:27:04 -----END NERRVANA POLLING CYCLE---
2012-11-14 08:27:04 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:27:04 Done.
2012-11-14 08:27:04 
-----END PLUGIN EXECUTION---
 
 
2012-11-14 08:27:04 
 
---BEGIN PLUGIN EXECUTION---
2012-11-14 08:27:04 ---INITIALIZATION STARTED---
2012-11-14 08:27:04 
---BEGIN PLUGIN SETTINGS---
	Nerrvana HTTP address: https://api.nerrvana.com
	Nerrvana API key: 2bf7c81-a031f-1ad2-fd3a6-f59b9e0668e
	Secret key:  wctfFwelygx3tXS4TasrsOS4oXV7YadcPppvEnx55WG7qPk6jrAHjJi1TRoLlhrarIlabte4H9zWROXVkLnXto2LlVC47EXx91Uu
	Space ID: 4144
	Space: Answers
	Space path[FTPS folder]: Answers/_files
	Selenium nodes per platform: 1
	Test run name: Answers TRUNK PostgreSQL
	Nerrvana platforms:
		Opera 12.02 (WinXP)
		Firefox 15.0 (WinXP)
	Executable file: xbuild-pgsql.sh
	Nerrvana FTPS address: ftp.nerrvana.com
	Nerrvana FTPS user: demo154
	Nerrvana FTPS pass: dem0l54
	Workspace folder: ./tests
	Max execution time: 3600
	Poll period: 20
	Parse user messages mode[results analyzer]: ON
	User message threshold: ERROR
-----END PLUGIN SETTINGS---
2012-11-14 08:27:04 -----INITIALIZATION COMPLETED---
 
2012-11-14 08:27:04 Generated test run name: Answers TRUNK PostgreSQL build #55
2012-11-14 08:27:04 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
"Fixed" robots.txt to initiate Jenkins build
 
2012-11-14 08:27:04 ---TESTS UPLOAD SKIPPED---
2012-11-14 08:27:06 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:27:06 New test run ID#953.
2012-11-14 08:27:06 New execution ID#5770.
2012-11-14 08:27:06 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:27:28 	Current execution status: run
 
2012-11-14 08:27:49 	Current execution status: run
 
----------- SOME LINES REMOVED ---------------------------------
 
2012-11-14 08:30:03 	Current execution status: run
 
2012-11-14 08:30:26 	Current execution status: ok
 
2012-11-14 08:30:26 -----END NERRVANA POLLING CYCLE---
2012-11-14 08:30:26 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:30:26 Done.
2012-11-14 08:30:26 ---BEGIN TEST EXECUTION RESULTS---
2012-11-14 08:30:26 At least 11 message(s) from Nerrvana side reach(es) or exceed(s) threshold level (ERROR).
Message analyzer marks execution as failure.
2012-11-14 08:30:26 -----END TEST EXECUTION RESULTS---
2012-11-14 08:30:26 
-----END PLUGIN EXECUTION---
 
 
Build step 'Nerrvana plug-in' marked build as failure
Finished: FAILURE

Как вы видите, непосредственно процесс Selenium-тестирования занял 8 минут (начало 08:22:49, конец 08:30:26). Всё, что происходит до него – deployment, занимает всего несколько секунд. В данном случае использовалось 2 платформы Nerrvana, но тестировались последовательно Answers с MySQL и с PostgreSQL.

Всего у нас 8 тестов при этом каждый выполняет много действий, но тестирует свой функционал приложения – поиск, работа с тегами, добавление вопросов и ответов, удаление и редактирование вопросов и ответов авторами, модераторами и администраторами итд. Мы можем запускать тесты в 4 потока по 2 теста в потоке. Распараллелив в 4 потока и добавив ещё 4 платформы, мы остаёмся примерно в рамках тех же 8 минут. Распараллелив в 8 потоков (по одному тесту на поток), мы можем добавить больше платформ или уменьшить время тестирования.

Давайте посмотрим детальнее, как распределились эти 8 минут в логах, которые я привёл.

Инициализация и генерация имени первого Test Run-a – 1 секунда

2012-11-14 08:22:49 ---INITIALIZATION STARTED---
----------- SOME LINES REMOVED ---------------------------------
2012-11-14 08:22:49 -----INITIALIZATION COMPLETED---
2012-11-14 08:22:49 Generated test run name: Answers TRUNK MySQL build #55
2012-11-14 08:22:49 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
"Fixed" robots.txt to initiate Jenkins build

Синхронизация – 33 секунды

2012-11-14 08:22:49 ---BEGIN UPLOADING TESTS TO NERRVANA FTPS---
[workspace] $ lftp -f upload-build-55-1352863447229969289.ftp
2012-11-14 08:23:22 -----END UPLOADING TESTS TO NERRVANA FTPS

Создание Test Runa-a в Nerrvana и запуск из API – 3 секунды.

2012-11-14 08:23:25 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:23:25 New test run ID#952.
2012-11-14 08:23:25 New execution ID#5769.

Выполнение тестов – 3 минуты 39 секунд

2012-11-14 08:23:25 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:23:47 	Current execution status: run
----------- SOME LINES REMOVED ---------------------------------
2012-11-14 08:27:04 	Current execution status: ok
2012-11-14 08:27:04 -----END NERRVANA POLLING CYCLE---
2012-11-14 08:27:04 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:27:04 Done.
2012-11-14 08:27:04 
-----END PLUGIN EXECUTION---

Второй вызов плагина.

Инициализация и генерация имени второго Test Run-a – 1 секунда

---BEGIN PLUGIN EXECUTION---
2012-11-14 08:27:04 ---INITIALIZATION STARTED---
2012-11-14 08:27:04 
2012-11-14 08:27:04 -----INITIALIZATION COMPLETED---
2012-11-14 08:27:04 Generated test run name: Answers TRUNK PostgreSQL build #55
2012-11-14 08:27:04 Generated test run description:
Created by Nerrvana-Jenkins plugin
Revision: 146
Committer: igork
Date: 2012-11-14 08:22:44 +0000 (Wed, 14 Nov 2012)
"Fixed" robots.txt to initiate Jenkins build

Уже не синхронизируем.

2012-11-14 08:27:04 ---TESTS UPLOAD SKIPPED---

Создание Test Run-a в Nerrvana и запуск из API – 2 секунды

2012-11-14 08:27:06 Creating and starting test run via Nerrvana HTTP API call...done.
2012-11-14 08:27:06 New test run ID#953.
2012-11-14 08:27:06 New execution ID#5770.

Выполнение тестов – 3 минуты 20 секунд

2012-11-14 08:27:06 ---BEGIN NERRVANA POLLING CYCLE (waiting for tests to complete)
2012-11-14 08:27:28 	Current execution status: run
----------- SOME LINES REMOVED ---------------------------------
2012-11-14 08:30:26 	Current execution status: ok
2012-11-14 08:30:26 -----END NERRVANA POLLING CYCLE---

Анализ результатов и подготовка отчёта – 1 секунда

2012-11-14 08:30:26 Saving execution results into /var/lib/jenkins/jobs/Answers/builds/2012-11-14_08-22-45/results.xml...
2012-11-14 08:30:26 Done.
2012-11-14 08:30:26 ---BEGIN TEST EXECUTION RESULTS---
2012-11-14 08:30:26 At least 11 message(s) from Nerrvana side reach(es) or exceed(s) threshold level (ERROR).
Message analyzer marks execution as failure.
2012-11-14 08:30:26 -----END TEST EXECUTION RESULTS---
2012-11-14 08:30:26

Таким образом, мы видим, что основное время – это работа тестов. Всё остальное, включая синхронизацию тестов между Jenkins и Nerrvana (помните, что LFTP обновляет только изменившийся код тестов) занимает суммарно несколько секунд. Данные цифры приведены для конфигурации приведенной мной в самом первом посте – deployment и jenkins хосты находятся в домашней сети на виртуалках, я подключён к интернету по ADSL2+, нахожусь в Сиднее, Nerrvana – в Техасе. Никаких супер-скоростей или близости расположения.

Каким образом можно сократить выполнение тестов в 2 раза в нашем случае?

Мы можем просто тестировать наше приложение на MySQL и PostgreSQL не последовательно, а параллельно. Но в этом случае, как показано на картинке ниже, у нас на Jenkins Dashboard будет не один job, а три (один upstream и два downstream)

или четыре (два upstream и два downstream).

К тому же отчет, создаваемый плагином Nerrvana и показанный на картинке выше, будет находиться внутри двух разных jobs, что усложнит и замедлит просмотр. Ещё одной закавыкой будет являться синхронизация тестов. Поскольку два плагина Nerrvana будут выполняться параллельно, они будут оба вынуждены делать синхронизацию. Это добавит 33 секунды, но сократит время тестирования почти в 2 раза. То есть получим общее время где-то 4.5 минуты.

В общем, пока мы запускаем тесты параллельно в одном job-e, как вы уже наверное догадались. Хотя с агрегацией отчётов (об этом далее) возможно, перейдём и к параллельному тестированию приложений, работающих с разными базами данных – ожидается добавление поддержки MS SQL (гулять так гулять). В этом случае можно будет забыть о кратком отчёте плагина Nerrvana в Jenkins, а использовать единый агрегированный отчёт.

Основное неудобство сейчас – это необходимость просматривать столько отчётов, на скольких платформах тестировали приложение. Краткие отчёты плагина Nerrvana не в счёт, так как тут у нас единый отчёт, но краткий. Иногда его достаточно, а иногда нет. Потому мы переделаем наш открытый фреймворк на генерацию результатов в XML формате. Эту информацию будет забирать Jenkins, и далее мы сделаем генератор/агрегатор отчётов. Как будут выглядеть такие отчеты, мы описали ранее. О деталях реализации расскажем, когда до неё доберёмся.

Схематически это будет работать так:

Если вам не нужно тестировать разные установки, вы по прежнему сможете делать всё это в рамках одного build-а, добавив шаг агрегирования после Selenium тестирования.

Ну и последнее что хотелось бы сделать так это получать логи веб-сервера и лог ошибок PHP (или того инструмента, на котором работает тестируемое вами приложение) и внедрить их в наши Selenium отчёты. Тогда было бы удобно как переходить от ошибок в логах к месту в Selenium отчёте, так и наоборот.

На этом мы заканчиваем рассказ о Selenium-тестировании веб-приложений в Deep Shift Labs с помошью Jenkins и Nerrvana. Надеемся, что вы нашли его полезным для себя.

Далее в блоге рассказ об экспорте результатов Selenium-тестирования в HP Quality Center (HP QC) с помощью веб-сервиса Bumblebee от Agiletestware.

Print this post | Home

Comments are closed.