웹 자동화 테스트(고급 학습 파트 1)

목차

1. csv 파일 읽기

2. 데이터 ddt 매개변수화

2.1 구현 단계

2.2 코드 예제(unittest 프레임워크)

3. PO 모드

3.1 소개

3.2 non-po 모드와 po 모드의 비교

3.3 Po 계층화 및 상호 관계

3.4 코드 예(비 PO 모드)

3.5 코드 예(PO 모드)

3.5.1 기본 페이지

3.5.2 PO 레이어

3.5.3 테스트 케이스 레이어

1. csv 파일 읽기

#通常文件csv
1.找到文件
url_path = os.path.join(os.path.dirname(__file__), "..", "..", "data", file_name)
2.打开这个文件
with open(url_path, "r", encoding="utf8") as file_data
3.读取这个文件中的内容:csv库
file_value = csv.reader(file_data)
4.把读取到的内容转换成python中的列表 
list_file = list(file_value)[line]
5.把读取到的内容返回出去(按行返回,1行就表示1个用例) 
return list_file
#当文件是配置文件时,第四步需要把数据转化成字典
4.把读取到的内容变成字典
dict_file = dict(file_value)
5.返回这个字典信息,所有一起返回
return list_file

2. 데이터 ddt 매개변수화

2.1 구현 단계

  1. 테스트 데이터 생성
  2. 데이터 읽기 방법을 캡슐화하고 테스트 스크립트에서 호출한 인터페이스/속성을 유지합니다(스크립트에 전달해야 하는 매개변수).
  3. 자동화된 테스트 스크립트 작성
  4. 스크립트는 데이터 파일 처리를 위해 캡슐화된 모듈을 호출하고 테스트 데이터를 도입합니다.
  5. 테스트 스크립트 실행 및 테스트 결과 분석

2.2 코드 예제(unittest 프레임워크)

import unittest
import ddt
from openpyxl import load_workbook
from selenium import webdriver

def Excelread():
    driver= load_workbook('sanmu.xlsx')
    sheet = driver['登录']
    rows = sheet.max_row
    usernamelist = []
    #取出表格中有用的数据信息
    for one in range(2, rows+1):
        #取出姓名
        name = sheet.cell(one, 2).value
        password = sheet.cell(one, 3).value
        usernamelist.append([name, password])
    driver.close()
    return usernamelist

@ddt.ddt
class Logincases(unittest.TestCase):
    a = 5
    b = 2
    @classmethod
    def setUpClass(cls) -> None:
    #数据可以是元祖,列表,字典
    value = Excelread()
    #装饰器@ddt.data是用来将value拆成['姓名数据', '密码数据']
    @ddt.data(*value)
    #unpack则是将['姓名数据', '密码数据']两个元素分别赋值传入给uname和passwd
    @ddt.unpack
    def test_login(self, uname, passwd):
        self.driver = webdriver.Chrome()
        self.driver.get('登录网站')
        self.driver.implicitly_wait(15)
        self.driver.find_element_by_name('userName').send_keys(uname)
        self.driver.find_element_by_name('userPass').send_keys(passwd)
        self.driver.find_element_by_css_selector('button[οnclick="login();"]').click()
    @classmethod
    def tearDownClass(cls) -> None:
        self.driver.quit()

if __name__ == '__main__':
    Logincases.main()

3. PO 모드

3.1 소개

    PO 모드: 페이지 개체는 비교적 좋은 디자인 모드로 간주되는 페이지 개체 디자인 모드입니다. 이 디자인 패턴에서 기능 클래스(PageObjects)는 각 페이지 간의 논리적 관계를 나타냅니다. 핵심 아이디어는 계층화, 느슨한 결합, 스크립트 재사용 및 쉬운 스크립트 유지 관리입니다.

3.2 non-po 모드와 po 모드의 비교

비 PO 모드 PO 모드
프로세스 지향 선형 스크립트 POM은 비즈니스 운영 프로세스에서 페이지 요소 포지셔닝을 분리합니다. 느슨한 결합을 달성하십시오.
열악한 재사용성 UI 요소의 변경은 비즈니스 로직 코드를 수정할 필요가 없습니다. 해당 PO 페이지를 찾아 위치를 수정하기만 하면 데이터 코드가 분리됩니다.
열악한 유지 보수 PO는 테스트 코드의 가독성, 높은 재사용성 및 유지 관리성을 향상시킬 수 있습니다.

3.3 Po 계층화 및 상호 관계

  1. 기본 레이어 BasePage: 가장 기본적인 Selenium의 기본 API 메서드, 요소 위치 지정, 프레임 점프 등을 캡슐화합니다.
  2. PO 레이어: 요소 포지셔닝, 요소 개체 획득, 페이지 작업
  3. 테스트 케이스 레이어: 비즈니스 로직, 데이터 기반
  4. 세 가지 간의 관계: PO 레이어는 기본 레이어를 상속하고 테스트 케이스 레이어는 PO 레이어를 호출합니다.

3.4 코드 예(비 PO 모드)

import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By

class PracTesting( unittest.TestCase ):

    @classmethod
    def setUpClass(cls) -> None:
        # 打开浏览器
        cls.driver = webdriver.Chrome()
        # 加载百度首页
        cls.driver.get( 'http://www.baidu.com' )
        cls.driver.fullscreen_window()
    def test01(self):
        self.driver.implicitly_wait(5)
        # 在百度搜索栏中输入软件测试
        self.driver.find_element( By.ID, 'kw' ).send_keys( '软件测试' )
        # 点击百度一下按钮
        self.driver.find_element( By.ID, 'su' ).click()
    def test02(self):
        time.sleep(2)
        #返回搜索页面
        self.driver.back()
        time.sleep(2)
        # 在百度搜索栏中输入接口测试
        self.driver.find_element( By.ID, 'kw' ).send_keys( '接口测试' )
        # 点击百度一下按钮
        self.driver.find_element( By.ID, 'su' ).click()

    @classmethod
    def tearDownClass(cls) -> None:
        cls.driver.quit()


if __name__ == '__main__':
    unittest.main()

3.5 코드 예(PO 모드)

3.5.1 기본 페이지

from selenium import webdriver

class BasePage:
    #构造方法
    def __init__(self):
        # 打开浏览器
        self.driver = webdriver.Chrome() 
        # 加载百度首页
        self.driver.get('http://www.baidu.com')

    #封装定位元素
    def find_ele(self,*args):
        ele = self.driver.find_element(*args)
        return ele

3.5.2 PO 레이어

from selenium.webdriver.common.by import By
from base.base_page import BasePage

class BaiduPage(BasePage):
    #元素定位,
    baidu_text_loc = (By.ID, 'kw')
    baidu_submit_loc = (By.ID, 'su')
    #获得元素对象,
    def get_text_obj(self):
        ele = self.find_ele(*BaiduPage.baidu_text_loc)
        return ele
    def get_submit_obj(self):
        ele = self.find_ele(*BaiduPage.baidu_submit_loc)
        return ele
    #页面操作
    def search(self,search_string):
        self.get_text_obj().send_keys(search_string)
        self.get_submit_obj().click()

3.5.3 테스트 케이스 레이어

from ddt import ddt, data
from po.baidu_page import BaiduPage

@ddt
class BaiduTest(unittest.TestCase):

    @data('软件测试','接口测试')
    def test01(self,seaString):
        BaiduPage().search(seaString)
        time.sleep(5)

if __name__ == '__main__':
    unittest.main()

추천

출처blog.csdn.net/m0_58807719/article/details/130036467