Блог вебразработчика
  • ГЛАВНАЯ
  • ПОДПИСКА

Запуск проекта Thucydides с помощью Jenkins

Дек04
2012
Написал Tatyana

В этой статье я приведу пример настройки проекта Thucydides в Jenkins. Jenkins — это сервер непрерывной интеграции с открытым исходным кодом, который на сегодняшний день является несомненным лидером среди подобных программных продуктов. Про установку и настройку сервера можно почитать по этой ссылке.

Помимо возможностей, которые предоставляют сервера непрерывной интеграции, почему еще использование Jenkins может быть незаменимо для Thucydides или Selenium проектов? Ответ на это достаточно прост и заключается он в удобстве, удобстве запуска тестов и удобстве их разработки.

Подавляющее большинство автоматизаторов запускают тесты на той же самой машине, на которой работают. Мало того, что окна браузера постоянно открываются поверх Ваших рабочих окон и мешают работать, тесты в этом случае чаще всего завершаются неудачей. Это происходит потому, что Вы не вовремя нажали SHIFT или CTRL, или Ваш случайный клик закрыл ожидаемый браузером алерт, либо просто окно браузера не было в фокусе во время выполнения тестов. Безусловно, лучшее решение — это выделение отдельной машины для работы драйвера или аренда кластера в облаках, но такое решение не всегда приемлемо по ряду финансовых причин. Альтернативным решением может быть использование невидимого HtmlUnit драйвера, но это лишь частичное решение, потому что некоторые тесты просто невозможно выполнить с его помощью.

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

Пошаговый пример создания проекта:

1. Создаем новую задачу «Создать проект maven2/3».

2. Настраиваем проект. В этом примере я использую репозиторий Mercurial для загрузки проекта в Jenkins. Все необходимые плагины (например, Jenkins Mercurial plugin) нужно установить заранее.

Если Вы работаете на одной машине, то можете и вовсе не использовать svn, а просто копировать Ваш проект с диска в Jenkins (разрабатывать проект непосредственно в workspace Jenkins не рекомендуется, чтобы избежать непредвиденной потери данных):

3. Настройка сборки. Здесь мы вызываем запуск проекта точно также, как и из командной строки.

mvn clean integration-test thucydides:aggregate

Только опускаем вызов «mvn», Jenkins сделает это за нас. Именно в этой строке выполняются все основные настройки запуска, передаются все параметры, касающиеся Thucydides и Maven.

4. Для того, чтобы облегчить настройку запуска и не править каждый раз команды в строке (особенно, если тесты запускаете не только Вы), можно сделать сборку параметризированной. Тогда каждый раз при сборке проекта Jenkins будет запрашивать значения этих параметров. Установите флажок «Это параметризованная сборка» и добавьте необходимые параметры, которые после будут использоваться в строке maven:

Добавляем созданные параметры в строку запуска:

Применяем конфигурацию и запускаем сборку проекта:

Следующим окном Jenkins будет запрашивать ввод параметров, после чего начнется сборка и выполнение тестов:

В Post Steps можно настроить копирование папки с отчетом Thucydides в какой-нибудь архив, потому что при каждом последующем запуске, в отличии от логов консоли, которые хранятся в Jenkins, отчет Thucydides будет очищаться и перезаписываться.
Настройте также запуск сборки по расписанию, оповещение по email о результатах и наслаждайтесь автоматизацией автоматизированного тестирования 🙂

P.S. Для того, чтобы получить возможность запускать тесты выборочно и использовать параметр testname, приведенный выше, нужно подкорректировать pom файл проекта следующим образом. Добавить свойство testname в проект:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <thucydides.version>0.9.77</thucydides.version>
    <webdriver.driver>firefox</webdriver.driver>
    <testname>**/*Test.java</testname>
</properties>

Настройка плагина для запуска тестов в стандартном варианте выглядит следующим образом:

<plugin>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.12</version>
    <configuration>
       <includes>
            <include>**/*Test.java</include>
            <include>**/Test*.java</include>
            <include>**/When*.java</include>
        </includes>
        <argLine>-Xmx512m</argLine>
        <parallel>classes</parallel>
        <systemPropertyVariables>
            <webdriver.driver>${webdriver.driver}</webdriver.driver>
        </systemPropertyVariables>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Используем наше свойство testname для конфигурации плагина:

<configuration>
   <includes>
        <include>${testname}</include>
    </includes>
    <argLine>-Xmx512m</argLine>
    <parallel>classes</parallel>
    <systemPropertyVariables>
        <webdriver.driver>${webdriver.driver}</webdriver.driver>
    </systemPropertyVariables>
</configuration>
  • Нравится
  • Tweet

Опубликовано в Thucydides - Помечено Jenkins, Thucydides
Рассказать всем Twitter Facebook Delicious StumbleUpon E-Mail
← DDT с использованием Thucydides и JUnit
Hibernate @OneToOne — отношение один к одному →

Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/u0420283/data/www/internetka.in.ua/wp-includes/class-wp-comment-query.php on line 405

24 комментариев

  1. Test's Gravatar Test
    05.12.2012 at 05:02 | Permalink

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

  2. user's Gravatar user
    11.12.2012 at 10:36 | Permalink

    а можно пример pom файла? для данной сборки.

    • Tatyana's Gravatar Tatyana
      11.12.2012 at 10:47 | Permalink

      Pom файл создан из архетипа net.thucydides:thucydides-simple-archetype с некоторыми изменениями запуска:

      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>example</groupId>
          <artifactId>thucydides</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>jar</packaging>
      
          <name>Sample Thucydides project</name>
      
          <properties>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <thucydides.version>0.9.77</thucydides.version>
              <webdriver.driver>firefox</webdriver.driver>
              <testname>**/*Test.java</testname>
          </properties>
      
          <dependencies>
              <dependency>
                  <groupId>net.thucydides</groupId>
                  <artifactId>thucydides-core</artifactId>
                  <version>${thucydides.version}</version>
              </dependency>
              <dependency>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-simple</artifactId>
                  <version>1.6.1</version>
              </dependency>
              <dependency>
                  <groupId>net.thucydides</groupId>
                  <artifactId>thucydides-junit</artifactId>
                  <version>${thucydides.version}</version>
                  <scope>test</scope>
              </dependency>
              <dependency>
                  <groupId>junit</groupId>
                  <artifactId>junit-dep</artifactId>
                  <version>4.10</version>
                  <scope>test</scope>
              </dependency>
              <dependency>
                  <groupId>org.hamcrest</groupId>
                  <artifactId>hamcrest-library</artifactId>
                  <version>1.1</version>
                  <scope>test</scope>
              </dependency>
          </dependencies>
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.12</version>
                      <configuration>
                          <skip>true</skip>
                      </configuration>
                  </plugin>
                  <plugin>
                      <artifactId>maven-failsafe-plugin</artifactId>
                      <version>2.12</version>
                      <configuration>
                         <includes>
                              <include>${testname}</include>
                          </includes>
                          <argLine>-Xmx512m</argLine>
                          <parallel>classes</parallel>
                          <systemPropertyVariables>
                              <webdriver.driver>${webdriver.driver}</webdriver.driver>
                          </systemPropertyVariables>
                      </configuration>
                      <executions>
                          <execution>
                              <goals>
                                  <goal>integration-test</goal>
                                  <goal>verify</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>2.3.2</version>
                      <configuration>
                          <source>1.5</source>
                          <target>1.5</target>
                      </configuration>
                  </plugin>
                  <plugin>
                      <groupId>net.thucydides.maven.plugins</groupId>
                      <artifactId>maven-thucydides-plugin</artifactId>
                      <version>${thucydides.version}</version>
                      <executions>
                          <execution>
                              <id>thucydides-reports</id>
                              <phase>post-integration-test</phase>
                              <goals>
                                  <goal>aggregate</goal>
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
      
          <profiles>
              <profile>
                  <id>maven2</id>
                  <activation>
                      <file>
                          <missing>${basedir}</missing>
                      </file>
                  </activation>
                  <reporting>
                      <plugins>
                          <plugin>
                              <groupId>net.thucydides.maven.plugins</groupId>
                              <artifactId>maven-thucydides-plugin</artifactId>
                              <version>${thucydides.version}</version>
                          </plugin>
                      </plugins>
                  </reporting>
              </profile>
              <profile>
                  <id>maven3</id>
                  <activation>
                      <file>
                          <exists>${basedir}</exists>
                      </file>
                  </activation>
                  <build>
                      <plugins>
                          <plugin>
                              <groupId>org.apache.maven.plugins</groupId>
                              <artifactId>maven-site-plugin</artifactId>
                              <version>3.0-beta-3</version>
                              <configuration>
                                  <reportPlugins>
                                      <plugin>
                                          <groupId>net.thucydides.maven.plugins</groupId>
                                          <artifactId>maven-thucydides-plugin</artifactId>
                                          <version>${thucydides.version}</version>
                                      </plugin>
                                  </reportPlugins>
                              </configuration>
                          </plugin>
                      </plugins>
                  </build>
              </profile>
          </profiles>
      </project>
      
      
  3. Яна's Gravatar Яна
    18.01.2013 at 09:45 | Permalink

    Здравствуйте, я добавила третий пареметр к сборке, который устанавливает в каком браузере запускать тесты. При запуске в firefox все работает, а в других браузерах нет, например в chrome выдается ошибка:
    3240 [main] ERROR net.thucydides.core.webdriver.WebDriverFacade — FAILED TO CREATE NEW DRIVER INSTANCE class org.openqa.selenium.chrome.ChromeDriver: Could not instantiate class org.openqa.selenium.chrome.ChromeDriver
    net.thucydides.core.webdriver.UnsupportedDriverException: Could not instantiate class org.openqa.selenium.chrome.ChromeDriver

    • Tatyana's Gravatar Tatyana
      18.01.2013 at 10:15 | Permalink

      Здравствуйте, в версиях 77 и 90 все работает нормально.

      Запускается ли хром из командной строки? из IDE?

      • Яна's Gravatar Яна
        18.01.2013 at 10:44 | Permalink

        В cmd и IDE выдает такую же ошибку. Какие измения нужно в pom файле сделать, для запуска в разных браузерах?

        • Tatyana's Gravatar Tatyana
          18.01.2013 at 10:48 | Permalink

          Все зависит от причины. Скиньте, пожалуйста, полный текст ошибки.

          • Яна's Gravatar Яна
            18.01.2013 at 11:39 | Permalink
            Caused by: java.lang.reflect.InvocationTargetException
            	at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
            	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
            	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
            	at net.thucydides.core.webdriver.WebdriverInstanceFactory.newInstanceOf(WebdriverInstanceFactory.java:36)
            	at net.thucydides.core.webdriver.WebDriverFactory.chromeDriverFrom(WebDriverFactory.java:327)
            	at net.thucydides.core.webdriver.WebDriverFactory.newWebdriverInstance(WebDriverFactory.java:139)
            	... 51 more
            Caused by: java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see http://code.google.com/p/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://code.google.com/p/chromedriver/downloads/list
            	at com.google.common.base.Preconditions.checkState(Preconditions.java:176)
            	at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:105)
            	at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:69)
            	at org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:141)
            	... 57 more
            
          • Tatyana's Gravatar Tatyana
            18.01.2013 at 11:59 | Permalink

            Какая у Вас версия Thucydides?

            Если верить ошибке, а именно вызывающей функции chromeDriverFrom(), то где-то 0.9.20. Если так, то стоит обновиться до одной из стабильных версий, например, 77.
            Если это не так, то значит, что у Вас мусор в проекте, в частности в pom-файле. От этого все и проблемы

  4. Яна's Gravatar Яна
    18.01.2013 at 12:36 | Permalink

    Обновила версию, но ошибка осталась.
    Возможно нужно прописать path?

    • Tatyana's Gravatar Tatyana
      18.01.2013 at 12:44 | Permalink

      Если ошибка в точности такая же, как и была, то нужно искать где у вас к проекту подключена старая библиотека

  5. Яна's Gravatar Яна
    21.01.2013 at 09:32 | Permalink

    Посмотрите, пожалуйста, pom файл. По-моему все библиотеки подключены верно. Тем не менее в chrome все также ошибка.

            <dependency> 
                 <groupId>org.seleniumhq.selenium</groupId> 
                 <artifactId>selenium-java</artifactId> 
                 <version>2.27.0</version> 
            </dependency> 
            <dependency> 
                <groupId>org.seleniumhq.selenium</groupId> 
                <artifactId>selenium-chrome-driver</artifactId> 
                <version>2.28.0</version> 
            </dependency> 
            <dependency> 
                <groupId>org.seleniumhq.selenium</groupId> 
                <artifactId>selenium-server</artifactId> 
                <version>2.28.0</version> 
            </dependency>          
            <dependency> 
                <groupId>net.thucydides</groupId> 
                <artifactId>thucydides-core</artifactId> 
                <version>${thucydides.version}</version> 
            </dependency> 
             <dependency> 
                    <groupId>org.slf4j</groupId> 
                    <artifactId>slf4j-simple</artifactId> 
                    <version>1.6.1</version> 
            </dependency>  
            <dependency> 
                <groupId>net.thucydides</groupId> 
                <artifactId>thucydides-junit</artifactId> 
                <version>${thucydides.version}</version> 
                <scope>test</scope> 
            </dependency> 
             <dependency> 
                <groupId>junit</groupId> 
                <artifactId>junit-dep</artifactId> 
                <version>4.10</version> 
                <scope>test</scope> 
            </dependency>  
            <dependency> 
                <groupId>org.hamcrest</groupId> 
                <artifactId>hamcrest-library</artifactId> 
                <version>1.1</version> 
                <scope>test</scope> 
            </dependency> 
    
    • Tatyana's Gravatar Tatyana
      21.01.2013 at 09:59 | Permalink

      Thucydides уже содержит все необходимые ему библиотеки Selenium, именно тех версий, с которыми он может работать. Подключать Selenium отдельно не стоит, это может приводить к ошибкам именно из-за конфликтов версий. В частности, Thucydides версии 0.9.92 включает в себя библиотеки Selenium версии 2.27. Попробуйте удалить верхние три зависимости: selenium-java, selenium-chrome-driver и selenium-server, и запуститься. Хотя Ваш pom файл у меня работает благополучно, значит в этом случае проблема не в нем

      • Яна's Gravatar Яна
        21.01.2013 at 10:21 | Permalink

        Я их только к последней сборке добавила, без них тоже не работает.
        Вот если в свойствах прописать путь к драйверу: webdriver.chrome.driver C:\Program Files\Google\Chrome\Application\chromedriver.exe /webdriver.chrome.driver), то тесты запускаются, но все failure(такого не должно быть)

        • Tatyana's Gravatar Tatyana
          21.01.2013 at 11:06 | Permalink

          Failure из-за чего? какая ошибка?

  6. Яна's Gravatar Яна
    21.01.2013 at 11:10 | Permalink

    [GET, HEAD, DELETE]
    Command duration or timeout: 1 milliseconds
    Build info: version: '2.27.0', revision: '18259', time: '2012-12-05 11:30:53'
    System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.7.0_09'
    Session ID: 31ebb2edc55bb547f9f99ba785554dae
    Driver info: org.openqa.selenium.chrome.ChromeDriver
    Capabilities [{platform=XP, chrome.chromedriverVersion=26.0.1383.0, acceptSslCerts=false, javascriptEnabled=true, browserName=chrome, rotatable=false, locationContextEnabled=false, version=24.0.1312.52, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, webStorageEnabled=true, nativeEvents=true, applicationCacheEnabled=false, takesScreenshot=true}]
    27983 [main] INFO net.thucydides.core.Thucydides —

    • Tatyana's Gravatar Tatyana
      21.01.2013 at 11:50 | Permalink

      К сожалению, не все тесты могут быть благополучно выполнены во всех браузерах — это уже отдельная тема. Здесь ошибка самого Selenium-а, а не Thucydides. Есть до сих пор открытые таски Selenium по хрому и ие, которые находятся в состоянии доработки.

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

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

  7. Яна's Gravatar Яна
    21.01.2013 at 14:15 | Permalink

    Спасибо, буду разбираться. А Вы не знаете, есть ли возможность запускать группы тестов (например по 10 из 100)? Параметризованная сборка описанная в блоге не очень подходит. Я видела решения только на основе Jenkins+Maven+TestNG

    • Tatyana's Gravatar Tatyana
      21.01.2013 at 14:33 | Permalink

      Если Вы имеете ввиду TestNG Groups, то их аналогом для JUnit будет использование Categories

      • Яна's Gravatar Яна
        25.01.2013 at 06:54 | Permalink

        А использование junit позволяет выводить дополнительную информацию в отчет для story или писать требования к тестам, как при использовании jbehave?

        • Tatyana's Gravatar Tatyana
          25.01.2013 at 07:51 | Permalink

          нет, для junit такой возможности нет

          • Яна's Gravatar Яна
            25.01.2013 at 08:43 | Permalink

            Жалко, я хотела вывести URL тестируемой страницы.

  8. Юрий's Gravatar Юрий
    22.01.2013 at 13:08 | Permalink

    Татьяна, здравствуйте!
    Не могли бы вы подсказать. У меня сервер на ubuntu. Настроил там Jenkins через Git. Сборка делается, но тесты не запускаются, выдаётся ошибка о том, что Cannot find firefox binary in PATH. Make sure firefox is installed. OS appears to be: LINUX. Вы писали об этом в одной из статей для Windows http://internetka.in.ua/selenium_driver_error/. Не подскажете ли, куда установить Firefox на сервере и как сказать тестам, чтобы они искали Firefox именно там?
    Заранее огромное спасибо!

    • Tatyana's Gravatar Tatyana
      22.01.2013 at 14:32 | Permalink

      Не важно куда будет установлен Firefox на сервере. Полный путь к нему можно получить командой:
      which firefox

      Полученный путь можно передать в тесты параметром:
      -Dwebdriver.firefox.bin=/usr/bin/firefox

      или сделать так, внести путь к firefox в переменную PATH системы:
      export PATH=$PATH:/usr/bin/firefox
      Тогда, теоретически, Selenium найдет его сам.

      Надеюсь, что поможет, потому что с линуксом дружу плохо 🙂

Свежие записи

  • WebDriver и SSL Untrusted certificate
  • Видеозапись выполнения тестов Selenium
  • Selenium WebDriver: basic авторизация
  • BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности
  • Hibernate 4: UserType пользовательский тип данных (часть 2)

Поиск

Рубрики

  • Hibernate ORM
  • SEO
  • Разное
  • Тестирование
    • JUnit
    • Selenium
    • Thucydides

Метки

Actions AJAX Alert AutoIt ChromeDriver Exceptions ExpectedConditions FindElement FirefoxDriver Hibernate InternetExplorerDriver Java Javascript Jenkins JUnit4 Maven PageFactory Page Object RemoteWebDriver Select Selenium IDE Selenium Server Selenium WebDriver switchTo Thucydides WebDriverWait XPath Автоматизированное тестирование база данных заработок в сети сеть Интернет скорость продвижения сайта статейное продвижение услуги продвижения

Реклама

встроенная мебель для гостинной шкафы купе вишневое mebelvdome дизайнерские шкафы купе;проверка на детекторе лжи https://pri.in.ua/2020/03/13/proverka-pri-prieme-na-rabotu/ pri.in.ua

Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.

Блог вебразработчика
Функциональное тестирование и продвижение сайтов

Яндекс.Метрика