Redmineプラグインの自動テスト

過去1年間で、 Redmine + Telegramバンドル用の4つのプラグイン( onetwothree4 )を開発しました。







少しずつ、彼らのためのベストプラクティスが開発されています。 この記事では、テストとTravis CIとの統合について説明します。











なぜテストについて話すことにしたのですか? Redmineのプラグインをテストすることは別の探求だからです。









はじめに...



最初の呼び出しからの通常のrspecは機能しませんでした。 2番目と3番目からも。







テストカバレッジが良好なプラグインの例も見つかりませんでした。 ほとんどのプラグインは完全にテストなしであるか、プラグイン自体が非常に単純であるため、それらのテストは1つのファイルに配置されています。 原則として、これらはビューのテストでした。 そして、ロジックをテストする必要があります。







最良の例は、Redmine自体のテストです。 このプロジェクトでは、小さなデザイン( 証明 )なしで通常のRailsデフォルトテストを使用します。







同じテスト内にコンテキストがないため、同じクラスの異なる状況をテストすることは困難です。 したがって、このアプローチを直接順守することで、かつて停止状態に陥りました。







2011年のRails Test Prescriptionブックは大いに役立ちました。 それから、Railsのデフォルトスタイルテストの書き方と、救いになったshoulda gemについて学びました。







例は先月発表したredmine_2faプラグインから提供されます。 また、新しく作成されたredmine_telegram_commonからも、これについては1日について説明します。







テストを実行する方法は?



テストの実行とRedmineのルート:







bundle exec rake redmine:plugins:test NAME=redmine_2fa
      
      





Redmine 3.3.1のバージョンでは、このコマンドが実行されると、多くのルビー警告がtest_helper.rb



れ、出力をクリーンにするために、 test_helper.rb



次の行を追加する必要があります。







 $VERBOSE = nil # for hide ruby warnings
      
      





テストでフィクスチャを使用するには、同じファイルに追加する必要があります







 ActiveRecord::FixtureSet.create_fixtures(File.dirname(__FILE__) + '/fixtures/', [:auth_sources])
      
      





代わりに:auth_sources



は、テストにロードする必要があるフィクスチャです。







Gemfile



 group :test do gem 'shoulda' end
      
      





shoulda-プラグインをテストするためのgemが必要です。 残り-テストのニーズに応じて。







コントローラーのパッチのテスト



 class AccountControllerPatchTest < ActionController::TestCase #        tests AccountController #   fixtures :users, :email_addresses, :roles, :auth_sources #       setup do @user = User.find(2) # jsmith Redmine2FA.stubs(:active_protocols).returns(Redmine2FA::AVAILABLE_PROTOCOLS) end #     context 'user without 2fa' do context 'with valid login data' do setup { post :login, username: 'jsmith', password: 'jsmith', back_url: 'http://test.host/' } context 'prepare' do should set_session[:otp_user_id].to(2) should set_session[:otp_back_url].to('http://test.host/') should 'set user instance variable' do assert_equal @user, assigns(:user) end end end end
      
      





スタブとモック



彼らは新しいものを探していませんでした。Redmineで使用されているmocha gemを使用しています。







使用例:







 User.any_instance.stubs(:mobile_phone).returns('7894561230') User.any_instance.expects(:authenticate_otp).returns(true)
      
      





ルートテスト



ルートのテストは、 integration/routing



フォルダーにあります。







Redmineには、テスト用の独自のヘルパーがあります。







 should_route 'POST /redmine_2fa/bot/init' => 'otp_bot#create'
      
      





ただし、複雑なルートの場合は、レールからヘルパーを使用する必要があります。







 assert_routing({ method: 'post', path: '/redmine_2fa/bot/token:token/update' }, controller: 'otp_bot_webhook', action: 'update', token: 'token:token')
      
      





単体テスト



それらを詳細に説明することは意味がありません。小さな例を使って説明しましょう。







 context 'confirmation' do setup do User.any_instance.stubs(:mobile_phone).returns('79243216547') end should 'confirm mobile phone with valid code' do User.any_instance.expects(:authenticate_otp).returns(true) @user.confirm_mobile_phone('valid') @user.reload assert @user.mobile_phone_confirmed? end should 'return errors with invalid code' do User.any_instance.expects(:authenticate_otp).returns(false) @user.confirm_mobile_phone('invalid') @user.reload assert !@user.mobile_phone_confirmed? assert @user.errors.present? end end
      
      





CIについて



記事の最初から覚えているように、プラグインテストはRedmineのルートから実行されます。 また、プラグイン自体のコードにはRedmineが含まれていません。







したがって、テストプロセスでは、Redmineのインストール、そのデータベースの初期化を含めてから、テストを実行する必要があります。







設定例



.travis.yml
 language: ruby rvm: - 2.3.0 addons: postgresql: "9.4" env: - REDMINE_VER=3.3-stable - REDMINE_VER=master install: "echo skip bundle install" before_script: - psql -c 'create database travis_ci_test;' -U postgres script: - export TESTSPACE=`pwd`/testspace - export NAME_OF_PLUGIN=redmine_telegram_common - export PATH_TO_PLUGIN=`pwd` - export PATH_TO_REDMINE=$TESTSPACE/redmine - mkdir $TESTSPACE - cp test/support/* $TESTSPACE/ - bash -x ./travis.sh
      
      





install



には費用がかかります







 install: "echo skip bundle install"
      
      





メインのインストールロジックはスクリプトで実行されるため

bash -x ./travis.sh









travis.sh
 #/bin/bash set -e if [[ ! "$TESTSPACE" = /* ]] || [[ ! "$PATH_TO_REDMINE" = /* ]] || [[ ! "$REDMINE_VER" = * ]] || [[ ! "$NAME_OF_PLUGIN" = * ]] || [[ ! "$PATH_TO_PLUGIN" = /* ]]; then echo "You should set"\ " TESTSPACE, PATH_TO_REDMINE, REDMINE_VER"\ " NAME_OF_PLUGIN, PATH_TO_PLUGIN"\ " environment variables" echo "You set:"\ "$TESTSPACE"\ "$PATH_TO_REDMINE"\ "$REDMINE_VER"\ "$NAME_OF_PLUGIN"\ "$PATH_TO_PLUGIN" exit 1; fi export RAILS_ENV=test export REDMINE_GIT_REPO=git://github.com/redmine/redmine.git export REDMINE_GIT_TAG=$REDMINE_VER export BUNDLE_GEMFILE=$PATH_TO_REDMINE/Gemfile # checkout redmine git clone $REDMINE_GIT_REPO $PATH_TO_REDMINE cd $PATH_TO_REDMINE if [ ! "$REDMINE_GIT_TAG" = "master" ]; then git checkout -b $REDMINE_GIT_TAG origin/$REDMINE_GIT_TAG fi mv $TESTSPACE/database.yml.travis config/database.yml mv $TESTSPACE/additional_environment.rb config/ # create a link to the backlogs plugin ln -sf $PATH_TO_PLUGIN plugins/$NAME_OF_PLUGIN # install gems bundle install # run redmine database migrations bundle exec rake db:migrate # run plugin database migrations bundle exec rake redmine:plugins:migrate bundle exec rake db:structure:dump # run tests bundle exec rake redmine:plugins:test NAME=$NAME_OF_PLUGIN
      
      





このスクリプトを使用する場合、テストデータベース設定はファイルtest/support/database.yml.travis



配置する必要がありtest/support/database.yml.travis









database.yml.travis
 test: adapter: postgresql encoding: unicode pool: 5 database: travis_ci_test user: postgres
      
      





まとめ



まもなく主要なポイントに行きました。 詳細と詳細について-コメントを続けます。 テストのその他の例は、 redmine_2faおよびredmine_telegram_commonのソースにあります








All Articles