测试框架目录设计


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()