백엔드/Strapi

[UI 테스팅 자동화] 테스팅 자동화 공통모듈 완성본

STUFIT 2022. 11. 22. 10:56
반응형

ver.1 으로 ui 테스팅 기능을 완료함.

'use strict';

/**
 * testcase service
 */

const { createCoreService } = require('@strapi/strapi').factories;
const { chromium, devices } = require('playwright');
const {
  loopElement,
  startTaskLoopElements,
} = require('../../../modules/testcase/loopElement');
const {
  elementValidation,
} = require('../../../modules/testcase/validationList');

module.exports = createCoreService('api::testcase.testcase', ({ strapi }) => ({
  async playTestcase(ctx, query) {
    const browser = await chromium.launch({
      headless: false,
      channel: 'chrome',
      logger: {
        //isEnabled: (name, severity) => name === 'browser',
        isEnabled: (name, serverity) => true,
        log: (name, severity, message, args, hints) =>
          console.log(
            `name:${name},message:${message},severity:${severity},args:${args}`
          ),
      },
      downloadsPath: './',
    });
    const testNm = await strapi.entityService.findMany(
      'api::testcase.testcase',
      {
        filters: { id: query.id, USE_YN: 'Y' },
        sort: { id: 'DESC' },
        populate: { TESTCASE_ELEMENTS: { filters: { USE_YN: 'Y' } } },
      }
    );
    // const mobile = devices['iPhone 13 Pro'];
    const elements = await testNm[0].TESTCASE_ELEMENTS;
    // SORT_NO 기준으로 오름차순
    const elementsDesc = await elements.sort(function (a, b) {
      return a.SORT_NO - b.SORT_NO;
    });
    const innerTextList = [];
    const tableTextList = [];
    // Open new page
    const context = await browser.newContext(); // PC버전

    const page = await context.newPage();
    try {
      // 테스트 시작점.
      await loopElement(elementsDesc, async (ele) => {
        try {
          await startTaskLoopElements(ele, page, innerTextList, tableTextList);
          // 루프를 돌면서 계속 검증함.
          if (ele.VALIDATION_YN === 'Y') {
            await elementValidation(innerTextList, tableTextList);
          }
        } catch (err) {
          console.log(err);
          const resMessage = {
            errorLogs: JSON.stringify(err),
            errorElement: ele,
          };
          throw resMessage;
        }
      });
      await browser.close();
      return {
        result: 'success',
        message: `${testNm[0].TEST_NM} 케이스 테스트에 성공하였습니다.`,
      };
    } catch (err) {
      const screenshotName = new Date().getTime();
      err.screenshotPath = screenshotName;
      // 위의 catch에서 받아온 err
      await page.screenshot({
        path: `./src/screenshot/${screenshotName}.png`,
      });
      await browser.close();
      ctx.response.badRequest(
        `${testNm[0].TEST_NM} 케이스 테스트에 실패하였습니다.`,
        `${JSON.stringify(JSON.stringify(err))}`
      );
      throw err;
    }
  },
}));
반응형