Help us understand the problem. What is going on with this article?

ATFでList型のフィールドに値設定できない

More than 1 year has passed since last update.
  • ServiceNowのバージョンはKingston

こまったこと

  • ATFのテスト内で、List型のフィールドに値を設定したかった
  • でもSet Field Values では設定できなかった
  • 必須フィールドなので設定できないとテストできない

回避策

  • そのテスト中のみ、デフォルト値を無理やり設定することで回避できた
  • ただし sys_dictionary テーブルの変更なので、テストはGlobalスコープで作成する必要がある
    • テスト実行時のスコープは、そのテストを作成したスコープと同じ
    • できれば避けたい。。。が、いい方法が思いつかない
  • また、実行時のユーザーは、アクセス制御的にsys_dictionary変更可能なユーザーである必要がある。

詳細

Serverカテゴリのテストステップを作成する

inputsは以下の通り

  • u_table(TableName型)
  • u_field(FieldName型, depend on で↑を選ぶ)
  • u_value(String型 長さは512※)

outputsは以下の通り

  • u_value(String型 長さは512※)

※ sys_dictionary.default_valueの文字長が512

説明生成スクリプト

function generateDescription() {
    var t = step.inputs.u_table;
    var f = step.inputs.u_field;
    var v = step.inputs.u_value; // String

    var description = "["+t+"."+f+"] のデフォルト値を一時的に ["+v+"] に変更します";
    return description;
}
generateDescription();

実行スクリプト

(function executeStep(inputs, outputs, stepResult, timeout) {
    try {
        // GlideRecord準備
        var gr = new GlideRecord('sys_dictionary');

        // 入力値を準備
        var t = inputs.u_table;
        var f = inputs.u_field;
        var v = inputs.u_value; // String

        // 一応出力
        outputs.u_value = v;

        // 対象のフィールドを検索
        gr.addQuery('name', t);
        gr.addQuery('element', f);
        gr.query();
        var found = gr.getRowCount();

        // 1件ではなかった場合はテスト失敗
        if (found != 1) {
            stepResult.setOutputMessage('['+t+'.'+f+'] の検索結果が'+found+'件でした');
            stepResult.setFailed();
            return;
        }

        // 見つかったレコードを対象にする
        gr.next();

        // デフォルト値を更新
        gr.default_value = v;
        var result = gr.update();

        if (result) {
            // 更新に成功した
            stepResult.setOutputMessage('['+t+'.'+f+'] のデフォルト値を一時的に ['+v+'] に変更しました('+result+')');
            stepResult.setSuccess();
        }  else {
            // 更新に失敗した
            stepResult.setOutputMessage('['+t+'.'+f+'] のデフォルト値を一時的に ['+v+'] に変更しようとしましたが、失敗しました');
            stepResult.setFailed();
        }
    } catch(e) {
        // 例外発生時はテスト失敗
        stepResult.setOutputMessage(e);
        stepResult.setFailed();
    }
}(inputs, outputs, stepResult, timeout));

おしまい

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away