목차
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 구현 단계
- 테스트 데이터 생성
- 데이터 읽기 방법을 캡슐화하고 테스트 스크립트에서 호출한 인터페이스/속성을 유지합니다(스크립트에 전달해야 하는 매개변수).
- 자동화된 테스트 스크립트 작성
- 스크립트는 데이터 파일 처리를 위해 캡슐화된 모듈을 호출하고 테스트 데이터를 도입합니다.
- 테스트 스크립트 실행 및 테스트 결과 분석
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 계층화 및 상호 관계
- 기본 레이어 BasePage: 가장 기본적인 Selenium의 기본 API 메서드, 요소 위치 지정, 프레임 점프 등을 캡슐화합니다.
- PO 레이어: 요소 포지셔닝, 요소 개체 획득, 페이지 작업
- 테스트 케이스 레이어: 비즈니스 로직, 데이터 기반
- 세 가지 간의 관계: 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()