백엔드/Strapi

[UI 자동화 테스팅] 서브테스크 기능 개발

STUFIT 2022. 11. 14. 10:26
반응형

현재 QA측에서 자동화 테스팅을 사용 시, 메인 테스크 안에 서브테스크로 들어가는 기능 개발 요청이 들어왔다.

서브테스크는 QA분들이 커스텀으로 본인이 원하는 기능 테스트를 만든 후, 이를 메인 테스크에 넣으면 메인테스크에서 일일히 작업목록을 적을 필요가 없기 때문에 필수적 기능 이라고 볼 수 있다.

해당 기능 개발 코드는 아래에 개시하며 추후 UI 자동화 테스팅에 대해 포스팅을 하겠다.

// [1] : 메타정보 루프 시작포인트
async function loopElement(elementArray, callback) {
  for (let index = 0; index < elementArray.length; index++) {
    if (elementArray[index].ENABLE_YN === 'Y') {
      await callback(elementArray[index], index, elementArray);
    } else {
      //console.log('사용안함', elementArray[index]);
    }
  }
}
// [2] : 서브테스크 루프 포인트
async function loopForSubTask(ele, page, innerTextList, tableTextList) {
  const subTask = await strapi.entityService.findMany(
    'api::testcase.testcase',
    {
      filters: { id: ele.FIELD_VALUE, USE_YN: 'Y' },
      sort: { id: 'DESC' },
      populate: { TESTCASE_ELEMENTS: { filters: { USE_YN: 'Y' } } },
    }
  );
  const elements = await subTask[0].TESTCASE_ELEMENTS;
  // SORT_NO 기준으로 오름차순
  const elementsDesc = await elements.sort(function (a, b) {
    return a.SORT_NO - b.SORT_NO;
  });
  await loopElement(elementsDesc, async (subEle) => {
    await startTaskLoopElements(subEle, page, innerTextList, tableTextList);
  });
}

async function startTaskLoopElements(ele, page, innerTextList, tableTextList) {
  if (ele.ACTION_TYPE === 'WEBSITE') {
    await page.goto(ele.FIELD_VALUE, {
      waitUntil: 'networkidle',
    });
  }
  await page.waitForTimeout(3000);
  if (ele.ACTION_TYPE === 'SUBTASK') {
    await loopForSubTask(ele, page, innerTextList, tableTextList);
  }
  if (ele.ACTION_TYPE === 'INPUT') {
    console.log(
      '순번: ',
      ele.SORT_NO,
      ' / 필드명: ',
      ele.FIELD_NM,
      ' / 필드값: ',
      ele.FIELD_VALUE
    );

    await page.locator(ele.SELECTOR_VALUE).click();
    await page.keyboard.type(ele.FIELD_VALUE, { delay: 100 });
  }
  if (ele.ACTION_TYPE === 'CLICK') {
    // await page.waitForTimeout(2000);
    console.log(
      '순번: ',
      ele.SORT_NO,
      ' / 필드명: ',
      ele.FIELD_NM,
      ' / 필드값: ',
      ele.FIELD_VALUE,
      ' / 검증할 텍스트: ',
      ele.VALIDATION_TEXT,
      ' / 액션유형: ',
      ele.ACTION_TYPE
    );
    await page.locator(ele.SELECTOR_VALUE).click();
  }
  if (ele.ACTION_TYPE === 'DOUBLECLICK') {
    // await page.waitForTimeout(2000);
    console.log(
      '순번: ',
      ele.SORT_NO,
      ' / 필드명: ',
      ele.FIELD_NM,
      ' / 필드값: ',
      ele.FIELD_VALUE,
      ' / 검증할 텍스트: ',
      ele.VALIDATION_TEXT,
      ' / 액션유형: ',
      ele.ACTION_TYPE
    );
    await page.locator(ele.SELECTOR_VALUE).click({ clickCount: 2 });
  }
  if (ele.ACTION_TYPE === 'KEYCODE') {
    // await page.waitForTimeout(2000);
    console.log(
      '순번: ',
      ele.SORT_NO,
      ' / 필드명: ',
      ele.FIELD_NM,
      ' / 필드값: ',
      ele.FIELD_VALUE,
      ' / 검증할 텍스트: ',
      ele.VALIDATION_TEXT,
      ' / 액션유형: ',
      ele.ACTION_TYPE
    );
    await page.keyboard.press(ele.ACTION_TYPE_KEYCODE);
  }
  // change as validation
  if (ele.ACTION_TYPE === 'INNERTEXT') {
    console.log(
      '순번: ',
      ele.SORT_NO,
      ' / 필드명: ',
      ele.FIELD_NM,
      ' / 필드값: ',
      ele.FIELD_VALUE,
      ' / 검증할 텍스트: ',
      ele.VALIDATION_TEXT,
      ' / 액션유형: ',
      ele.ACTION_TYPE
    );
    const textObj = {};
    const textValue = await page.locator(ele.SELECTOR_VALUE).innerText();
    textObj.eleInfo = ele;
    textObj.sortNo = ele.SORT_NO;
    textObj.fieldNm = ele.FIELD_NM;
    textObj.fieldValue = ele.FIELD_VALUE;
    textObj.textValue = textValue;
    textObj.validatetionText = ele.VALIDATION_TEXT;
    innerTextList.push(textObj);
  }
  if (ele.ACTION_TYPE === 'TABLE') {
    console.log(
      '순번: ',
      ele.SORT_NO,
      ' / 필드명: ',
      ele.FIELD_NM,
      ' / 필드값: ',
      ele.FIELD_VALUE,
      ' / 검증할 텍스트: ',
      ele.VALIDATION_TEXT,
      ' / 액션유형: ',
      ele.ACTION_TYPE
    );
    const textObj = {};
    await page.locator(ele.SELECTOR_VALUE).click();
    // await page.mouse.wheel(5000, 20000);
    await page.waitForTimeout(5000);
    const textValue = await page.$(ele.SELECTOR_VALUE);
    const getTableValue = await page.evaluate((getData) => {
      const replaceInnerText = getData.innerText.replace(/\n/g, '');
      const splitText = replaceInnerText.split('\t');
      // const result = splitText[0].split('\n');
      return splitText;
    }, textValue);
    textObj.eleInfo = ele;
    textObj.sortNo = ele.SORT_NO;
    textObj.fieldNm = ele.FIELD_NM;
    textObj.textValue = getTableValue;
    textObj.validatetionText = ele.VALIDATION_TEXT;
    tableTextList.push(textObj);
  }
}

module.exports = {
  loopElement: loopElement,
  startTaskLoopElements: startTaskLoopElements,
  loopForSubTask: loopForSubTask,
};
반응형