コーディングの途中でテストを行うことは、正しく機能していない要素に注意を払い、新しいコードで価値を追加する際に不具合を検出することを可能にするという意味で、常に推奨される手法です。チームが増大し、Nuxeo Studioプロジェクトが複雑化するに伴い、この手法はさらに重要となります。Nuxeo Studio のブランチ管理Nuxeo CLIを使用すると、より創意に富んだコードをビルドし、チームを効率的に拡張し、開発時にバグを見つけて、Studio プロジェクトを検証することができます。

Nuxeo オンラインサービス(NOS)アカウントに Nuxeo CLI を接続する

Nuxeo CLI 1.5 以降、プロジェクトを NOS アカウントに接続して、CLI を使用して対話操作できるようになっています。このサポートは開始されたばかりであり、今後数週間でさらに多くの機能が追加される予定です。この CLI はすでに非常に有益であることがわかっています。以下では CLI についてご説明します。

まずは接続してみましょう。ご希望の端末エミュレータを使用して、プロジェクトのルートフォルダに移動し(または、新しいルードフォルダを作成して)、次のコマンドを実行します。

$ nuxeo studio

NOS の認証情報とプロジェクトの識別名を入力するよう求められます(入力した情報は保存ませんのでご安心ください。この後はトークンが使用されます)。

「nuxeo studio」を次のように実行します。

$ nuxeo studio
    info You are going to link a Studio project to this project.q
? NOS Username: akervern
? NOS Password: ********
? Studio Project: akervern-SANDBOX

認証情報と Studio プロジェクトを入力した後で、Maven の依存関係ツリーが更新されます。最後の質問にどう答えるべきかは、Maven のグローバル設定ファイルによって決まります。Studio Maven のリポジトリは保護されているため、アーチファクトをダウンロードしたり、インターネットにアクセスしたりするための権限を与えられていることが必要となります。NOS の認証情報がまだ登録されていない場合、認証情報は Nuxeo CLI によって「nuxeo-studio」サーバに追加されます。これは強調してお伝えすることですが、先に進む前に Maven のパスワード暗号化ガイドに目を通し、必ずそれに従ってください。パスワードをクリアテキストで受け渡しすることはタブーです。

「settings.xml」ファイルをオーバーライドすることが心配な場合は、以下をご覧ください。

conflict ../../../../.m2/settings.xml
? Overwrite ../../../../.m2/settings.xml? (Ynaxdh)
  y) overwrite
  n) do not overwrite
  a) overwrite this and all others
  x) abort
  d) show the differences between the old and the new
  h) Help, list all options
  Answer:

まず相違点を表示して(「d」)、変更後のコード行が正しいことを確認することをお勧めします。その後で、問題がなければ、変更でオーバーライド(「y」)することができます。

シンプルなスクリプトオペレーションの作成

次に、Studio プロジェクトでシンプルな自動化スクリプトを作成してみましょう。Nuxeo Studioを開き、「void」を入力と出力の両方として使用して、「smartest_thing」という自動化スクリプトオペレーションを作成します。

内容は次のように微々たるものです。

function run(input, params) {
  return 5;
}

このオペレーションを忘れずに保存してください。次のステップはこれよりも興味深いものです。

Studio でのユニットテスト

ここでは、Nuxeo テストに関する基本的な知識が皆さんにあり、Junit ベースのユニットテストフレームワークに関する文献に軽く目を通したことがあるという前提で話を進めたいと思います。Studio バンドルのテスト方法に関する私の著書をすでに読んだことのある方は準備万全です。

ここで使用する新しいアノテーション「PartialDeploy」は、「9.1」または「8.10-HF04」以降で利用可能な機能です。この機能を使用すると、テストの際にデプロイするコントリビューションを要件にとらわれずに正確に選択できます。付属の事前入力クラスを使用すると、Studio で設定可能な大半の機能をデプロイすることが可能です。

  • org.nuxeo.runtime.test.runner.TargetExtensions.ContentModel:スキーマ、ドキュメントタイプ、ライフサイクル、ディレクトリ、バージョンポリシーをデプロイします。 - org.nuxeo.runtime.test.runner.TargetExtensions.ContentTemplate:「ContentModel」およびコンテンツテンプレートからのあらゆる機能をデプロイします。 - org.nuxeo.runtime.test.runner.TargetExtensions.Automation:「ContentModel」、自動化チェーン、自動化スクリプトからのあらゆる機能をデプロイします。

自動化スクリプトオペレーションのテスト

まず、空のテストをブートストラップしましょう。

$ nuxeo bootstrap test-empty
     info Installation of single-module is skipped.
     info You'll be prompted for generation of:
     info   blog-project-core: test-empty
    create Generate Module: blog-project-core
    create Generating Test empty
     info   Parameters: Unit test package, Unit test class name, Using feature
? Unit-Test package: org.nuxeo.sample
? Unit-Test class name: MySmartestOperation
? Using Feature: AutomationFeature
     info Maven dependency: org.nuxeo.runtime:nuxeo-runtime-test:::test
     info Maven dependency: org.nuxeo.ecm.platform:nuxeo-platform-test:::test
     info Maven dependency: org.nuxeo.ecm.platform:nuxeo-platform-audit-core::test-jar:test
     info Maven dependency: org.nuxeo.ecm.automation:nuxeo-automation-test:::test
    force pom.xml
   create src/test/java/org/nuxeo/sample/MySmartestOperation.java
     info You can start editing code or you can continue with calling another generator (nuxeo bootstrap [<generator>..])

ご希望の IDE を使用して、ユニットテストクラス「MySmartestOperation」を開きます。次に、テストのアライメントを行って、オペレーションによって「5」が正しく返されることを確認します。

より「現実的」なスクリプトをテストしたい場合は、実際のプロジェクトバンドルも忘れずにデプロイしてください。

package org.nuxeo.sample;
 import static org.junit.Assert.assertEquals;
 import javax.inject.Inject;
 import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.automation.AutomationService;
import org.nuxeo.ecm.automation.OperationContext;
import org.nuxeo.ecm.automation.OperationException;
import org.nuxeo.ecm.automation.test.AutomationFeature;
import org.nuxeo.ecm.core.test.DefaultRepositoryInit;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.PartialDeploy;
import org.nuxeo.runtime.test.runner.TargetExtensions;
 /**
 * Empty Unit Testing class.
 * <p/>
 *
 * @see <a href="https://doc.nuxeo.com/corg/unit-testing/">Unit Testing</a>
 */
@RunWith(FeaturesRunner.class)
@Features(AutomationFeature.class)
@RepositoryConfig(init = DefaultRepositoryInit.class, cleanup = Granularity.METHOD)
// !! Notice your Project symbolic name is prefixed with "studio.extension."
@PartialDeploy(bundle = "studio.extensions.akervern-SANDBOX", extensions = TargetExtensions.Automation.class)
public class MySmartestOperation {
     @Inject
    protected AutomationService automationService;
     @Test
    public void assertWeAreSmart() throws OperationException {
        // !! Notice the Scripting name is prefixed with "javascript."
        Object res = automationService.run(new OperationContext(), "javascript.smartest_thing");
        assertEquals(5, res);
    }
}

これで完成です!自動化スクリプトオペレーションの動作を検証する、最初のユニットテストを作成できました。TDDへようこそ!

ボーナスポイント

クリーンデプロイメントの熱狂的支持者、ものごとを効果的に行うことに喜びを見出す人、あるいはベストプラクティスに従う人であれば、プロジェクトモジュールの一部としてNuxeo パッケージをすでに所有していることでしょう。そうでない場合は、「nuxeo bootstrap package」を実行してクリーンデプロイメントへの移行に着手することができます。その後で、プロジェクトをビルドし、「{プロジェクト名}-package/target/{プロジェクト名}-1.0.zip」に含まれているパッケージファイルを開きます。ファイルの内容を見てください。Studio プロジェクトの jar ファイルがこのファイルに追加されていることがわかります。これにより、カスタムの Java バンドルと Studio プロジェクトを同時にインストールすることが可能となります。デプロイメントの複雑性が軽減すると、より価値の高いプロセスに時間を費やせるようになります。