测试框架目录设计
https://blog.csdn.net/weixin_45294964/article/details/113512584
po设计模式 page object
创建可以跨多个测试用例共享的代码
减少重复代码的数量
如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较高的
目录结构:
base:基础层,里面主要编写的是测试框架的基础代码
page:对象层,里面主要编写的是页面对象操作的每一个行为
test:测试层,里面主要编写测试模块(编写具体的测试用例)
common:存储公共的代码,如路径处理等
utils:存储工具类,主要指的是对各种文件的处理
data:该文件夹主要存储测试过程中使用到的数据
report:该文件夹存储测试报告
config:该文件夹存储配置文件(如测试地址等地址)
一、目录结构设计
框架的目录结构设计
基础层
下面主要实现基础层的代码,在base包下创建模块为basePage.py的文件,里面的源码信息为:
from selenium.webdriver.common.by import By #导入元素定位法
import time
class WebUI(): #元素定位法,父类
def __init__(self,driver):
self.driver=driver #固定格式,后面要用到,实例化后的对象self.driver==webdriver.Chrome()
def findElement(self,*args): #固定写法必须元组
'''单个元素定位的方法'''
try:
return self.driver.find_element(*args)
except Exception as e: #排除异常
print(e.args)
def findElements(self,*args):
'''多个元素定位的方法'''
try:
return self.driver.find_elements(*args) #手动敲方法
except Exception as e:
print(e.args)
对象层
下面以sina的邮箱为案例来编写具体的代码,在page包下创建login.py的文件,里面的源码具体为:
import time
from selenium.webdriver.common.by import By
from base.base import WebUI #
class Login(WebUI): #登录继承base里的我们写的元素定位方法
'''编写登录页面的每一个行为'''
username=(By.ID,'freename') #用户名
password=(By.ID,'freepassword') #密码
loginButton=(By.CLASS_NAME,'loginBtn') #登录
loginReg=(By.LINK_TEXT,'注册') #注册
tishi=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
def userNAME(self,value):
'''输入账户值'''
self.findElement(*self.username).send_keys(value) # * 把后面的定义为元组, **把后面的定义为字典
def passWORD(self,vaule):
'''输入密码值'''
self.findElement(*self.password).send_keys(value) # *是前面findElement要的是元组
def clickLOGIN(self):
'''点击登录'''
self.findElement(*self.loginButton).click()
time.sleep(2)
def gettishi(self):
'''获取错误提示'''
return self.findElement(*self.tishi).text #提示都有返回值.text的形式
测试层
下来在测试层,也就是test包下创建test_sina_login.py的模块来执行,切记,需要执行验证下我们编写的具体的测试用例。原代码具体为:
先测试固件分离
我们已经达到了数据驱动的分离,下来针对测试固件进行分离,在page包下创建init.py文件
from selenium import webdriver
import unittest
class Init(unittest.TestCase): #初始化测试,里面是测试用例的收集,以及决定了测试用例的执行
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.driver.maximize_window()
self.driver.get('https://mail.sina.com.cn/#')
self.driver.implicitly_wait(30)
def tearDown(self) -> None:
self.driver.close()
再写测试用例,直接继承
from selenium import webdriver
from page.Init import INIT #下面初始化继承用,
from page.login import Login #继承login里的登录行为
class LoginTEST(INIT,Login):
'''1,初始化已继承'''
def test_sina_login_username(self):
'''#测试用例1,账户为空点击登录提示信息'''
self.userNAME('') #self.userNAME是继承了Login的方法
self.clickLOGIN() #self.clickLOGIN是继承了Login的方法
self.assertEqual(self.gettishi(),'请输入邮箱名')
def test_sina_login_password(self):
'''#测试用例2,用户密码都错点击登录提示信息'''
self.userNAME('dwadwa')
self.passWORD('daw')
self.clickLOGIN()
self.assertEqual(self.gettishi(),'您输入的邮箱名格式不正确')
def test_sina_login_denglu(self):
'''#测试用例3,用户密码都错点击登录提示信息'''
self.userNAME('15771@sinna.com')
self.passWORD('dawwe')
self.clickLOGIN()
self.assertEqual(self.gettishi(),'请输入正确的新浪邮箱帐号和密码')
if __name__ == '__main__':
unittest.main() #main要加括号
公共方法
下来在common包下创建public.py的模块,里面主要编写针对文件路径的处理,具体源码如下:
# 公共路径
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readFile(directory='data',fileName=None):
return os.path.join(base_dir(),directory,fileName)
数据驱动
下来在data的文件夹下创建sina.json的文件,把登录使用到的数据分离到sina.json的文件里面,该文件
的具体内容为:
publik 公共库里只是处理路径
# 公共路径处理,
import os
def base_dir():
return os.path.dirname(os.path.dirname(__file__))
def readFile(directory='data',fileName=None): #读取目录,文件
return os.path.join(base_dir(),directory,fileName) #把目录,目录,文件拼接。
数据驱动里面的 加载文件
import json
from common.pubilk import readFile # 导入文件路径处理函数
# 打开并加载文件,并且给文件赋名
def readJSON():
return json.load(open(readFile(fileName='sina.json'),encoding='utf-8'))
测试报告
测试报告
import os,time,unittest
from HTMLTestRunner import HTMLTestRunner #要使用 HTMLTestRunner 首先要导入模块
def base_dir(): #获取上一级的目录
return os.path.dirname(os.path.dirname(__file__))
def allTest(): #获取所有测试文件————(把上级目录和测试文件拼接,用单元测试框架里的TestLoader()里的discover打开)
suite=unittest.TestLoader().discover(start_dir=os.path.join(base_dir(),"test"),pattern='test_*.py')
return suite
def RUN(): #创建测试报告文件并实例化后跑起来————(1.把上级目录和测试报告拼接,并且创建.html的测试报告文件,2.测试报告文件实例化,然后跑测试报告,跑的内容是所有测试用例)
#创测试报告的html文件,此时还是个空文件
fp=open(os.path.join(base_dir(),'report','report1.html'),'wb')
runner=HTMLTestRunner(stream=fp,title='这是自动化测试报告标题',description='这是描述')
runner.run(allTest())
RUN()