Salesforce B2C Commerce カートリッジソースコードのテストについて

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

この記事では[SFRA](https://github.com/SalesforceCommerceCloud/storefront-reference-architecture)にデフォルトで入っているテストツールを紹介します。
※ mocha, chai, codeceptjs といったサードパーティの使い方については説明しませんので、ご了承ください。


## 利用方法

[sgmf-scripts](https://www.npmjs.com/package/sgmf-scripts) というSFRAを利用するために便利なコマンドツールを通して利用します。
コードがすでにpackage.json内のスクリプトとして記載されていますので、npm 〜 といった形で利用することになります。

## ユニットテスト
#### 利用しているツール

[mocha](https://mochajs.org/), [chai](https://www.chaijs.com/), [sinon](https://sinonjs.org/)


#### 実行方法

テストコードは、`/test/unit` 内に作成します。あらかじめSFRAのテストコードが入っているので、参考にしながら作成してください。テストコード作成した後は下記コマンドを実行します。

```sh
## テストを実行
npm test
## テストを実行し、さらにカバレージを出力
npm run cover
```

カバレージは `/coverage` に出力されます。


## インテグレーションテスト


#### 利用しているツール

[mocha](https://mochajs.org/), [chai](https://www.chaijs.com/)

#### 実行方法

テストコードは、`/test/integration` 内に作成します。あらかじめSFRAのテストコードが入っているので、参考にしながら作成してください。テストコード作成した後は下記コマンドを実行します。
実際にソースコードをサーバーにデプロイした後に実行するため、テストするホストを指定する必要があるので、`-- --baseUrl` をつけています。指定しない場合は、`dw.json` 内のhostnameを参照します。

```sh
npm run test:integration -- --baseUrl XXXX.XXXX.XXXX.dx.commercecloud.salesforce.com
```

サイトによってパスが違うと思います。`test/integration/it.config.js` に適切なパスを設定してください。 
_**※ デフォルトのテストコードではエラーが出てしまうかもしれないので、テストコードを修正してください。**_




## EtoE テスト

#### 利用しているツール

[codeceptjs](https://codecept.io/)


#### 実行方法

デフォルトでは下記のコードで動くことになっています。

```sh
npm run test:acceptance:smoke chrome
```

ドメインは`codecept.conf.js`にて`dw.json`の`hostname`を読み込んでいます。
また、サイトによってパスが違うと思います。`test/acceptance/metadata.json` に適切なパスを設定してください。 
_**※ デフォルトのテストコードではエラーが出てしまうかもしれないので、テストコードを修正してください。**_


#### Mac OS上だとうまく動かないようですので、下記では違うやり方でやる方法を紹介します。

* codeceptjsとpuppeteerのインストール

```sh
## package.jsonの依存関係のインストール
npm install
## codeceptjsのインストール
npx create-codeceptjs .
## puppeteerのインストール
npm install --save-dev puppeteer
## 脆弱性の修正
npm audit fix
```

* `codecept.conf.js` を下記の内容で `package.json` と同じ階層でに設置。（`npx codeceptjs init`でも設定できるようですが、省いています。）

```javascript
const { setHeadlessWhen, setCommonPlugins } = require('@codeceptjs/configure');
const cwd = process.cwd();
const fs = require('fs');
const path = require('path');
setHeadlessWhen(process.env.HEADLESS);
setCommonPlugins();

function getDwJson() {
  if (fs.existsSync(path.join(cwd, 'dw.json'))) {
      return require(path.join(cwd, 'dw.json'));
  }
  return {};
}

const DEFAULT_HOST = 'https://' + getDwJson().hostname;
const HOST = DEFAULT_HOST || process.env.HOST;

const metadata = require('./test/acceptance/metadata.json');

exports.config = {
  gherkin: {
    features: './test/acceptance/features/**/*.feature',
    steps: './test/acceptance/steps/**/*.js',
  },
  cleanup: true,
  coloredLogs: true,
  output: './output',
  helpers: {
    Puppeteer: {
      url: HOST,
      show: false,
      windowSize: '1200x900',
      waitForTimeout: 100000
    },
  },
  include: metadata.include,
  bootstrap: null,
  mocha: {},
  plugins: {
    screenshotOnFail: {
      enabled: true,
    },
    retryFailedStep: {
      enabled: true,
    }
  },
  name: 'sample-cicd'
}
```

* 下記のコマンドで実行します

```sh
npx codeceptjs run
```

**_※ デフォルトのテストコードではエラーが出てしまうかもしれないので、テストコードを修正してください。_**