Selenium 프레임워크: 데이터, 키워드 및 하이브리드 기반

⚡ 스마트 요약

Selenium 프레임워크: 데이터 기반, 키워드 기반, 하이브리드 기반 접근 방식은 테스터가 자동화 코드를 구성하고, 테스트 데이터를 분리하고, 로직을 재사용하는 방식을 정의합니다. 이 글에서는 각 프레임워크 유형, 아키텍처, 장점, 그리고 실제 구현 방법을 단계별로 설명합니다. Selenium WebDriver 코드 예제.

  • 핵심 정의: A Selenium 프레임워크는 자동화된 테스트 스크립트의 재사용성, 이식성 및 유지 관리를 향상시키는 구조화된 코드 아키텍처입니다.
  • 📊 데이터 기반 구현: Excel, CSV 또는 XML 파일을 사용하여 테스트 데이터와 로직을 분리하고, Apache POI(XLS 파일의 경우 HSSF, XLSX 파일의 경우 XSSF)를 통해 입력을 읽으십시오.
  • 🔑 키워드 기반 디자인: 키워드 시트와 객체 저장소를 통해 UI 동작을 제어하여 수동 테스터가 코드를 작성하지 않고도 테스트 케이스를 구축할 수 있도록 합니다. Java 암호.
  • ⚙️ 하이브리드 최적화: 결합 TestNG 키워드 실행 기능을 갖춘 데이터 제공업체는 유연성, 확장성 및 스크립트 유지 관리 부담 감소 효과를 얻을 수 있습니다.
  • 🧩 객체 저장소의 이점: 속성 파일에 로케이터를 중앙 집중화하여 요소 변경 시 모든 테스트 케이스에서 한 곳만 업데이트하면 되도록 합니다.

Selenium 뼈대

Selenium 뼈대?

The Selenium 자동화 프레임워크 프레임워크는 테스트 유지 관리를 간편하고 확장 가능하며 효율적으로 만들어주는 구조화된 코드 아키텍처입니다. 프레임워크가 없으면 테스터는 코드와 데이터를 같은 위치에 배치하는 경우가 많은데, 이는 재사용성도 떨어지고 가독성도 낮아집니다. 프레임워크를 도입하면 코드 재사용성 향상, 이식성 개선, 스크립트 유지 관리 비용 절감, 가독성 향상, 테스트 로직과 입력 데이터 간의 명확한 관심사 분리 등과 같은 측정 가능한 이점을 얻을 수 있습니다.

사용하는 이유 Selenium 자동화 프레임워크?

잘 설계된 Selenium 이 프레임워크는 테스트 자동화에서 고질적인 세 가지 문제, 즉 코드 중복, 불안정한 로케이터, 관리하기 어려운 테스트 데이터를 해결합니다. 명확한 구조를 적용함으로써 팀은 테스트 스위트를 소수의 스크립트에서 수백 개로 확장하더라도 제어력을 잃지 않고 효율적으로 관리할 수 있습니다.

  • 유지보수성: 중앙 집중식 로케이터와 헬퍼 메서드를 사용하면 한 번의 변경으로 해당 요소를 사용하는 모든 테스트가 업데이트됩니다.
  • 재사용 성: 로그인, 탐색 또는 양식 입력과 같은 일반적인 작업은 한 번만 작성하여 여러 테스트 케이스에서 호출할 수 있습니다.
  • 확장성: 새로운 테스트 케이스를 추가하는 것은 코딩 작업이 아닌 데이터 업데이트가 되므로 개발자가 아닌 사람들도 시나리오를 제공할 수 있습니다.
  • 보고 및 협업: 표준화된 구조 덕분에 보고 도구, CI/CD 파이프라인 및 버전 관리 시스템과의 통합이 더욱 쉬워집니다.

유형 Selenium 뼈대

기본이 XNUMX개가 있는데 프레임워크 유형 에 구축 Selenium WebDriver를 사용하여 수동 테스트 케이스를 자동화할 수 있습니다. 각 스타일은 개발자의 노력, 테스터 참여도, 데이터 유연성 간의 균형을 다르게 목표로 합니다.

  • 데이터 기반 프레임워크
  • 키워드 기반 프레임워크
  • 하이브리드 기반 프레임워크

유형 Selenium 뼈대

다음 섹션에서는 가장 간단한 데이터 기반 접근 방식부터 시작하여 가장 유연한 하이브리드 모델에 이르기까지 각 프레임워크를 자세히 설명합니다.

데이터 기반 프레임워크 Selenium

데이터 기반 프레임워크 Selenium 테스트 데이터 세트를 테스트 케이스 로직에서 분리하는 방법입니다. 데이터가 분리되면 테스트 코드를 건드리지 않고 특정 기능에 대한 입력값을 수정할 수 있습니다. 이 방법은 일반적으로 외부 소스에서 테스트 케이스 및 테스트 스위트를 가져오는 데 사용됩니다. 뛰어나다.csv, .xml 또는 데이터베이스 테이블.

데이터 기반 프레임워크 Selenium

Apache는 Excel 파일을 읽거나 쓰기 위해 널리 알려진 POI 라이브러리를 제공합니다. 이 라이브러리는 Excel 파일 읽기/쓰기와 Excel 파일 쓰기를 모두 처리할 수 있습니다. XLS XLSX 형식입니다. HSSF 구현 방식은 기존 XLS 파일을 읽는 반면, XSSF 이 구현은 최신 XLSX 파일을 처리합니다.

우리는 이미 데이터 기반 테스트에 대해 다뤘습니다. 이전 튜토리얼.

키워드 기반 프레임워크 Selenium

키워드 기반 프레임워크 Selenium 이 방법은 공통 기능과 명령에 대한 키워드를 분리하여 자동화 속도를 높입니다. 모든 작업과 명령은 일반적으로 Excel 시트와 같은 외부 파일에 작성됩니다. 테스터는 코드를 수정하지 않고 검증하려는 기능을 지정할 수 있습니다. Java 이러한 코드 스타일은 비즈니스 분석가나 수동 QA 담당자가 테스트 정의를 제공하는 팀에 이상적입니다.

전체 프레임워크는 다음과 같습니다.

키워드 기반 프레임워크 Selenium

보시다시피, 이것은 5단계 프레임워크입니다. 각 단계를 자세히 살펴보겠습니다.

단계 1)

  • 드라이버 스크립트 Execute.java는 Read를 호출합니다.Guru99ExcelFile.java.
  • 읽기Guru99ExcelFile.java 파일에는 Excel에서 데이터를 읽는 POI 코드가 포함되어 있습니다.

단계 2)

  • 읽기Guru99ExcelFile.java는 TestCase.xlsx 파일에서 데이터를 읽습니다.
  • 시트의 모습은 다음과 같습니다.

키워드 기반 프레임워크 엑셀 시트 Selenium

  • 엑셀 파일에 작성된 키워드를 기반으로 프레임워크는 UI에서 해당 작업을 수행합니다.
  • 예를 들어, "로그인"이라고 표시된 버튼을 클릭하려면 Excel 시트에 "Click"이라는 키워드가 저장됩니다. 페이지에 있는 여러 버튼 중에서 로그인 버튼을 식별하기 위해 Excel 행에서는 객체 이름을 loginButton으로, 객체 유형을 이름으로 정의합니다(이미지에서 강조 표시된 행 참조). 객체 유형은 XPath, CSS, 클래스 또는 다른 로케이터 전략일 수도 있습니다.

단계 3) 읽기Guru99ExcelFile.java는 파싱된 데이터를 드라이버 스크립트인 Execute.java로 다시 전달합니다.

단계 4)

  • 모든 UI 웹 요소에 대해 XPath, 이름, CSS 또는 클래스 이름과 같은 요소 로케이터를 저장하는 객체 저장소를 유지 관리합니다.

키워드 기반 프레임워크의 객체 저장소

  • Execute.java(드라이버 스크립트)는 전체 객체 저장소를 읽어 변수에 저장합니다.
  • ReadObject 헬퍼 클래스는 런타임에 리포지토리를 로드하는 getObjectRepository 메서드를 제공합니다.

키워드 기반 프레임워크를 위한 ReadObject 헬퍼 클래스

알림: 객체 리포지토리가 왜 필요한지 궁금하실 수 있습니다. 그 이유는 유지보수성 때문입니다. 만약 이름이 'btnlogin'인 버튼이 10개의 테스트 케이스에서 사용되고 개발자가 이 버튼의 이름을 'submit'으로 변경한다면, 객체 리포지토리를 사용하지 않을 경우 10개의 파일을 모두 수정해야 합니다. 하지만 객체 리포지토리를 사용하면 한 곳에서만 로케이터를 변경할 수 있습니다.

단계 5)

  • 드라이버는 Excel과 객체 저장소의 데이터를 UI로 전달합니다.Opera수업.
  • UIOpera이 패키지에는 CLICK 및 SETTEXT와 같은 각 키워드를 구체적인 WebDriver 액션에 매핑하는 함수가 포함되어 있습니다.
  • UIOperation은 Java 웹 요소와 상호작용하기 위한 실제 구현을 담고 있는 클래스입니다.

UIOpera키워드 기반 프레임워크의 tion 클래스

전체 프로젝트 구조는 다음과 같습니다.

키워드 기반 프레임워크의 전체 프로젝트 구조

실제 사례를 살펴보겠습니다.

테스트 시나리오 : 저희는 2개의 테스트 케이스를 실행하고 있습니다.

  • 테스트 케이스 1:
  • 고토 https://demo.guru99.com/V4/
  • 사용자 ID를 입력하세요
  • 암호를 입력
  • 재설정을 클릭하십시오.
  • 테스트 케이스 2:
  • 고토 https://demo.guru99.com/V4/
  • 사용자 ID를 입력하세요
  • 암호를 입력
  • 로그인을 클릭하십시오

객체.속성

url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset

읽기Guru99ExcelFile.java

package excelExportAndFileIO;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadGuru99ExcelFile {
    public Sheet readExcel(String filePath, String fileName, String sheetName) throws IOException {
        // Create a File object to open the xlsx file
        File file = new File(filePath + "\\" + fileName);
        // Create a FileInputStream to read the Excel file
        FileInputStream inputStream = new FileInputStream(file);
        Workbook guru99Workbook = null;
        // Detect the file extension
        String fileExtensionName = fileName.substring(fileName.indexOf("."));
        if (fileExtensionName.equals(".xlsx")) {
            guru99Workbook = new XSSFWorkbook(inputStream);
        } else if (fileExtensionName.equals(".xls")) {
            guru99Workbook = new HSSFWorkbook(inputStream);
        }
        // Read the sheet inside the workbook by its name
        Sheet guru99Sheet = guru99Workbook.getSheet(sheetName);
        return guru99Sheet;
    }
}

ReadObject.java

package operation;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ReadObject {
    Properties p = new Properties();

    public Properties getObjectRepository() throws IOException {
        // Read the object repository file
        InputStream stream = new FileInputStream(new File(System.getProperty("user.dir") + "\\src\\objects\\object.properties"));
        // Load all objects
        p.load(stream);
        return p;
    }
}

UIOperation.java

package operation;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class UIOperation {
    WebDriver driver;

    public UIOperation(WebDriver driver) {
        this.driver = driver;
    }

    public void perform(Properties p, String operation, String objectName, String objectType, String value) throws Exception {
        System.out.println("");
        switch (operation.toUpperCase()) {
            case "CLICK":
                driver.findElement(this.getObject(p, objectName, objectType)).click();
                break;
            case "SETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
                break;
            case "GOTOURL":
                driver.get(p.getProperty(value));
                break;
            case "GETTEXT":
                driver.findElement(this.getObject(p, objectName, objectType)).getText();
                break;
            default:
                break;
        }
    }

    private By getObject(Properties p, String objectName, String objectType) throws Exception {
        if (objectType.equalsIgnoreCase("XPATH")) {
            return By.xpath(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CLASSNAME")) {
            return By.className(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("NAME")) {
            return By.name(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("CSS")) {
            return By.cssSelector(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("LINK")) {
            return By.linkText(p.getProperty(objectName));
        } else if (objectType.equalsIgnoreCase("PARTIALLINK")) {
            return By.partialLinkText(p.getProperty(objectName));
        } else {
            throw new Exception("Wrong object type");
        }
    }
}

ExecuteTest.java

package testCases;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class ExecuteTest {
    @Test
    public void testLogin() throws Exception {
        WebDriver webdriver = new FirefoxDriver();
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        // Read keyword sheet
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        // Find the number of rows in the Excel file
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        for (int i = 1; i < rowCount + 1; i++) {
            Row row = guru99Sheet.getRow(i);
            if (row.getCell(0).toString().length() == 0) {
                System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
                        row.getCell(3).toString() + "----" + row.getCell(4).toString());
                operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
                        row.getCell(3).toString(), row.getCell(4).toString());
            } else {
                System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
            }
        }
    }
}

실행 후 출력 결과는 다음과 같습니다.

키워드 기반 프레임워크 실행 결과

를 다운로드 Selenium 이 튜토리얼의 데모용 프로젝트 파일

하이브리드 기반 프레임워크

하이브리드 기반 프레임워크 in Selenium 키워드 기반 프레임워크와 데이터 기반 프레임워크의 장점을 결합한 모델입니다. 수동 테스터가 프레임워크 코드를 작성하지 않고도 키워드, 테스트 데이터 및 객체 저장소를 편집하여 간단하게 테스트 케이스를 생성할 수 있도록 하는 사용하기 쉬운 모델입니다.

여기서 엑셀 파일은 각 단계의 키워드를 유지합니다. TestNG의 데이터 제공자 테스트 데이터를 제공합니다. 이 분할을 통해 액션 어휘와 입력 변형을 각각 독립적으로 확장할 수 있습니다.

하이브리드 구동 프레임워크 아키텍처

하이브리드 프레임워크의 경우 키워드 기반 구조는 전혀 변경되지 않습니다. 단지 ExecuteTest.java를 HybridExecuteTest.java로 바꾸기만 하면 됩니다.

하이브리드 구동 프레임워크 구성 요소 교체

이 HybridExecuteTest 파일에는 키워드 기반 로직과 결합된 전체 로직이 포함되어 있습니다. TestNG데이터 제공자 메커니즘.

하이브리드 프레임워크의 전체적인 그림 표현은 다음과 같습니다.

하이브리드 구동 프레임워크의 전체 표현

HybridExecuteTest.java

package testCases;
import java.io.IOException;
import java.util.Properties;
import operation.ReadObject;
import operation.UIOperation;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import excelExportAndFileIO.ReadGuru99ExcelFile;

public class HybridExecuteTest {
    WebDriver webdriver = null;

    @Test(dataProvider = "hybridData")
    public void testLogin(String testcaseName, String keyword, String objectName, String objectType, String value) throws Exception {
        if (testcaseName != null && testcaseName.length() != 0) {
            webdriver = new FirefoxDriver();
        }
        ReadObject object = new ReadObject();
        Properties allObjects = object.getObjectRepository();
        UIOperation operation = new UIOperation(webdriver);
        operation.perform(allObjects, keyword, objectName, objectType, value);
    }

    @DataProvider(name = "hybridData")
    public Object[][] getDataFromDataprovider() throws IOException {
        Object[][] object = null;
        ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
        Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
        int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
        object = new Object[rowCount][5];
        for (int i = 0; i < rowCount; i++) {
            Row row = guru99Sheet.getRow(i + 1);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                object[i][j] = row.getCell(j).toString();
            }
        }
        System.out.println("");
        return object;
    }
}

를 다운로드 Selenium 이 튜토리얼의 데모용 프로젝트 파일

자주 묻는 질문

수동 테스터가 코딩 없이 테스트 케이스를 작성해야 하는 경우 키워드 기반 방식을 선택하세요. 동일한 스크립트를 다양한 입력 변형에 대해 실행해야 하는 경우 데이터 기반 방식을 선택하세요. 데이터의 유연성과 키워드 수준의 테스트 작성 기능이 동시에 필요한 경우 하이브리드 방식을 사용하세요.

Apache POI는 데이터 소스로 사용되는 Excel 파일을 읽고 씁니다. HSSF는 기존의 .xls 파일을 처리하고, XSSF는 최신 .xlsx 파일을 처리합니다. 이 둘을 함께 사용하면 테스트 스크립트에서 데이터를 하드코딩하지 않고 스프레드시트에서 동적 입력을 가져올 수 있습니다.

객체 저장소는 XPath, CSS 또는 이름과 같은 요소 위치 지정자를 중앙 집중화합니다. 개발자가 UI 컨트롤의 이름을 변경하는 경우 모든 테스트 케이스를 업데이트하는 대신 하나의 항목만 업데이트하면 되므로 유지 관리 시간이 크게 줄어들고 스크립트 오류 발생 위험이 감소합니다.

AI가 개선됩니다 Selenium 자체 복구 로케이터, 지능형 테스트 우선순위 지정 및 시각적 검증을 통해 프레임워크를 지원합니다. AI 엔진은 로케이터 드리프트를 감지하고 안정적인 셀렉터를 추천하며 오류 패턴을 분석하여 테스트 대상 애플리케이션이 발전하더라도 하이브리드 테스트 스위트의 신뢰성을 유지합니다.

네. 최신 AI 비서는 테스트 대상 애플리케이션을 분석하여 키워드 라이브러리, 샘플 입력 및 예외 상황을 제안합니다. 테스터는 이러한 제안을 검토하고 개선하여 프레임워크 설정 속도를 높이는 동시에 효율성을 유지합니다.ping 핵심 검증 로직에 대한 인간의 감독.

이 게시물을 요약하면 다음과 같습니다.