Автоматизация тестирования

в WordPress

Основы основ

Геннадий Ковшенин / @soulseekah

О чем Вы, сэр?

  • тестирование - зачем?
  • тестирование плагинов и тем
    • модульное тестирование
    • системное тестирование
  • непрерывное внедрение
  • экономия человеческих ресурсов
  • качество кода - выше
  • уверенность, гарантии
  • дисциплина, культура

Модульное vs. Системное

Unit vs. System/Integration

Модульное

  • маленькие, быстрые, независимые тесты
  • единицы (юниты), асинхронно
  • кратковременные состояния
  • всё отдельно
  • пишем сразу

Модульное тестирование плагинов

						
$expectation = 1;
$reality = my_function_add( 1, 0 );
if ( $reality !== $expectation )
  exit 'Не прокатывает совсем...';
						
					
						
function test_my_function_add() {
  $this->assertEquals(
    1, my_function_add( 1, 0 )
  );
}
						
					

OK (1 test, 1 assertion)

Готовим окружение под PHPUnit

						
svn co https://unit-tests.svn.wordpress.org/trunk
vim wp-tests-config-sample.php
						
					
						
cat /path/to/my/plugin/tests/unit/phpunit.xml
<phpunit bootstrap="bootstrap.php" colors="true">
  <testsuites>
    <testsuite>
      <directory suffix=".php">.</directory>
    </testsuite>
  </testsuites>
</phpunit>
						
					
						
cat /path/to/my/plugin/tests/unit/bootstrap.php 
require '/path/to/wordpress_tests/includes/bootstrap.php';
require dirname( __FILE__ ) . '/../../my-plugin.php';
define( 'MY_PLUGIN_DOING_TESTS', 1 );
						
					
						
class Tests_MyPlugin extends WP_UnitTestCase {
  function test_my_function_add() {
    $this->assertEquals(
      1, my_function_add( 1, 0 )
    );
  }
}
						
					
						
phpunit -c /path/to/my/plugin/tests/unit/
						
						

OK (1 test, 1 assertion)

Плагины

  • забываем о стандартных do_action (и cron, ajax, etc.)
  • доверяем WordPress API, они уже протестированы
  • тестируемость - инкапсуляция, гибкость функционала (do_action, call_user_func), DI

Виджеты

  • register_widget
  • new MyWidget()

Темы

JavaScript

Системное тестирование

  • медленные, последовательные тесты
  • огромные сценарии поведения, синхронно
  • долговременные состояния, сессии, паузы
  • всё в перемешку
  • можно писать потом

Системное тестирование плагинов

Настройка окружения

						
wget http://wordpress.org/latest.tar.gz
tar xvf latests.tar.gz
cd wordpress
vim config-sample.php
cp -rv /path/to/testplugin wp-content/plugins/
						
					
						
// Contact
casper.start( BASE_URL + '/contact',
  function( response ) {
	  this.fill(
		'form[action="/contact"]',
		{
		  email: 'me@test.org',
		  message: 'Позвоните мне!',
		}, true );
} );
						
					
						
// Check
casper.thenOpen( ADMIN + '/edit.php?post_type=contact',
  function( response ) {
    this.test.assertEquals(
      this.evaluate( function() {
        return jQuery( '#the-list tr:nth(1)' ).text();
      } ), 'me@test.org' );
    }
} );
						
					

Проблемы

  • тестировать внешние ресурсы можно (иногда нужно)
  • прозрачность затычек - wp-cli, mu-plugin, meta, options/transients, $_COOKIE, JavaScript mock, отдельные тест версии
  • PhantomJS != настоящий браузер

Автоматизация внедрения

Примеры

Полезности

Что дальше?

  • пишите тесты
  • выкладывайте свои скрипты
  • разрабатывайте модели и стратегии
  • делитесь мыслями

Геннадий Ковшенин

http://codeseekah.com