- 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));
おしまい