Статьи

Автоматизация тестов PHPUnit в Windows Azure

Чтобы начать новый год, я хотел бы продолжить пару постов, которые я написал в прошлом месяце: Мысли о тестировании приложений OSS в Windows Azure и Запуск PHPUnit в Windows Azure . В этой статье я покажу вам, как развернуть тесты PHPUnit вместе с приложением, запустить тесты как задачу запуска и записать результаты в вашу учетную запись хранения для анализа. К этому сообщению прилагается ZIP- файл, содержащий скелетный проект, который можно использовать для автоматического запуска тестов PHPUnit при развертывании приложения PHP в Azure. Я покажу вам, как использовать скелетный проект, а затем немного подробнее расскажу о том, как все это работает (чтобы вы могли вносить изменения в случае необходимости).

Однако, во-первых, пара «уроков» высокого уровня, когда я работал над этим:

  • Все дело в относительных каталогах. При развертывании приложения в Windows Azure нет никаких гарантий относительно местоположения вашего корневого каталога. Вы знаете, что это будет называться Approot , но вы не знаете, будет ли это на диске C: \, D: \, E: \ и т. Д. (Хотя, по моему опыту, это всегда был E: \ аппот ). Чтобы убедиться, что ваше приложение и сценарии запуска будут работать правильно, вам следует избегать использования абсолютных путей (что, как представляется, часто встречается в файле php.ini ).
  • Знать, как создавать сценарии, как пакетные сценарии, так и сценарии Powershell. Я все еще относительно новичок в написании сценариев, но они необходимы для создания задач запуска в Azure. Благодаря Powershell многие полезные сведения о Azure доступны через различные командлеты.

В любом случае, чтобы использовать прикрепленный скелетный проект, вот что вам нужно сделать:

1. Загрузите и распакуйте вложенный файл AzurePHPWebRole.zip. Вы найдете следующую структуру каталогов:

-AzurePHPWebRole
    -AzurePHPWebRole
        -bin
            -configurephp.ps1
            -install-phpmanager.cmd
            -runtests.ps1
            -setup.cmd
            -PHP
        -ресурсов
            -WebPICmdLine
                — (Web PI .dll файлы) —
        тесты
        — (файлы приложения)
        — (любые внешние библиотеки )
        -diagnostics.wadcfg
        -web.config
    -ServiceDefinition.csdef

2. Скопируйте файлы приложения в каталог AzurePHPWebRole \ AzurePHPWebRole . Это корневой каталог приложения. Ваши юнит-тесты должны быть помещены в каталог тестов .

3. Скопируйте локальную установку PHP в каталог AzurePHPWebRole \ AzurePHPWebRole \ bin \ PHP . Я предполагаю, что у вас установлен PHPUnit как пакет PEAR. Если вы следовали установке PEAR и PHPUnit по умолчанию, они будут включены как часть вашей пользовательской установки PHP. После копирования вашей установки PHP вам нужно будет сделать две незначительные модификации:

а. Убедитесь, что любые пути в вашем файле php.ini являются относительными (например, extension_dir = ”. \ Ext” ).

б. Отредактируйте файл phpunit.bat, чтобы исключить использование абсолютных путей. Для этого я изменил строки 1 и 7, чтобы использовать % ~ dp0 вместо текущего каталога в приведенном ниже коде:

 

 1: if "%PHPBIN%" == "" set PHPBIN=%~dp0php.exe
 2: if not exist "%PHPBIN%" if "%PHP_PEAR_PHP_BIN%" neq "" goto USE_PEAR_PATH
 3: GOTO RUN
 4: :USE_PEAR_PATH
 5: set PHPBIN=%PHP_PEAR_PHP_BIN%
 6: :RUN
 7: "%PHPBIN%" "%~dp0phpunit" %*

4. Создайте каркасный файл ServiceConfiguration.cscfg с помощью следующей команды (запускается из каталога AzurePHPWebRole ):

cspack ServiceDefinition.csdef /generateConfigurationFile:ServiceConfiguration.cscfg /copyOnly

5. Отредактируйте сгенерированный файл ServiceConfiguration.cscfg. Вам нужно будет указать osfamily = ”2” и osversion = ”*” , а также указать информацию о соединении вашей учетной записи хранения:

<?xml version="1.0"?>

<ServiceConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                      serviceName="AzurePHPWebRole" 
                      xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"
                      osFamily="2"
                      osVersion="*">

  <Role name="AzurePHPWebRole">

    <ConfigurationSettings>

      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="YourStorageAccountConnectionStringHere" />

    </ConfigurationSettings>

    <Instances count="1" />

   </Role>

</ServiceConfiguration>

6. Упакуйте свое приложение для развертывания. Чтобы создать файл .cspkg , необходимый для развертывания приложения, выполните следующую команду из каталога AzurePHPWebRole :

cspack ServiceDefinition.csdef

7. Разверните ваше приложение. Наконец, вы можете развернуть свое приложение. Этот учебник проведет вас через шаги: http://azurephp.interoperabilitybridges.com/articles/deploying-your-first-php-application-to-windows-azure#new_deploy .

После успешного развертывания вашего приложения (и я предполагаю, что вы внедряете его в промежуточную среду), результаты ваших тестов будут записаны в вашу учетную запись хранения в контейнере больших двоичных объектов, который называется wad-custom . Предполагая, что ваши тесты пройдены, вы готовы перейти к развертыванию в производственной среде.

Как все это работает?

Вот как это работает. Диагностика Windows Azure может подобрать любой файл, который вам нужен, и отправить его в учетную запись хранения. Если вы посмотрите на файл ServiceDefinition.csdef в прикрепленном скелетном проекте, вы увидите это:

<LocalResources>

   <LocalStorage name="MyCustomLogs" sizeInMB="10" cleanOnRoleRecycle="false" />

</LocalResources>

Эта запись создает локальный каталог MyCustomLogs при развертывании проекта. Если вы также посмотрите на файл Diagnics.wadcfg в скелетном проекте, вы увидите это:

<DataSources>

   <DirectoryConfiguration container="wad-custom" directoryQuotaInMB="128">

      <LocalResource name="MyCustomLogs" relativePath="customlogs" />

   </DirectoryConfiguration>

</DataSources>

Это говорит модулю «Диагностика» искать в каталоге customlogs локального ресурса MyCustomLogs и отправлять результаты в вашу учетную запись хранения в контейнере больших двоичных объектов, который называется wad -custom . Задачи запуска будут записывать результаты теста PHPUnit в каталог customlogs , который модуль Diagnostics затем передает в вашу учетную запись хранения. (Дополнительные сведения о диагностике Windows Azure см. В разделе Как получить диагностическую информацию для приложений Azure / PHP, часть 1 и часть 2. )

Конечно, сложная часть заключается в написании сценариев для запуска PHPUnit и записи результатов в пользовательские журналы . Возвращаясь к файлу ServiceDefinition.csdef, вы видите, что он содержит следующие строки:

<Startup>             

   <Task commandLine="install-phpmanager.cmd" executionContext="elevated" taskType="simple" />

   <Task commandLine="setup.cmd" executionContext="elevated" taskType="simple" />

</Startup>

Эти строки сообщают Windows Azure, что нужно запускать сценарии install-phpmanager.cmd и setup.cmd по порядку ( tasktype = ”simple” гарантирует, что они запускаются последовательно). Давайте посмотрим на эти сценарии.

Сценарий install-phpmanager.cmd устанавливает менеджер PHP для IIS :

@echo off
cd "%~dp0"
ECHO Starting PHP Manager installation... >;> ..\startup-tasks-log.txt
 
md "%~dp0appdata"
cd "%~dp0appdata"
cd "%~dp0"
 
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d "%~dp0appdata" /f
"..\resources\WebPICmdLine\webpicmdline" /Products:PHPManager /AcceptEula  >;> ..\startup-tasks-log.txt 2>>..\startup-tasks-error-log.txt
reg add "hku\.default\software\microsoft\windows\currentversion\explorer\user shell folders" /v "Local AppData" /t REG_EXPAND_SZ /d %%USERPROFILE%%\AppData\Local /f
 
ECHO Completed PHP Manager installation. >> ..\startup-tasks-log.txt

Командлеты Powershell для PHP Manager используются для изменения вашей установки PHP; в частности, параметр include_path . (Помните, у нас нет гарантии того, где будет находиться корень нашего приложения.) Вы можете увидеть, как используются командлеты в скрипте configurephp.ps1 (который вызывается из скрипта setup.cmd ):

Add-PsSnapin PHPManagerSnapin
 
new-phpversion -scriptprocessor .\php
 
$include_path_setting = get-phpsetting -Name include_path
 
$include_path = $include_path_setting.Value
 
$current_dir = get-location
 
$new_path = '"' + $include_path.Trim('"') + ";" + $current_dir.Path + "\php\PEAR" + '"'
 
set-phpsetting -Name include_path -Value $new_path
 
$extension_dir = '"'  + $current_dir.Path + "\php\ext" + '"'
 
set-phpsetting -Name extension_dir -Value $extension_dir

Setup.cmd просто вызывает configurephp.ps1 и runtests.ps1 сценарий с политикой исполнения «неограниченном»:

powershell -command "Set-ExecutionPolicy Unrestricted"
powershell .\configurephp.ps1
powershell .\runtests.ps1

Сценарий runtests.ps1 помещает PHP в переменную среды Path, получает местоположение нашего ресурса MyCustomLogs и запускает PHPUnit (с выводом, записанным в каталог customlogs ):

Add-PSSnapIn Microsoft.WindowsAzure.ServiceRuntime
 
[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";" + $pwd + "\PHP;")
 
cd ..
 
$rootpathelement = get-localresource MyCustomLogs
 
$customlog = join-path $rootpathelement.RootPath "customlogs\test.log"
 
phpunit tests >$customlog

Это в основном это. Если вы попробуете, пожалуйста, дайте мне знать, как это происходит. Готов поспорить, есть области, в которых весь этот процесс может быть улучшен.

Спасибо.

-Брайан

 

Источник: http://blogs.msdn.com/b/silverlining/archive/2012/01/03/automating-phpunit-tests-in-windows-azure.aspx