框架设计的6层

我们在设计框架的时候需要哪些包:
ui自动化时有生成报告路径,还有运行用例的报告路径,,自动化搜索用例路径,这些路径都是可控的。

(1)新一个项目,在新的窗口(比如:论坛的框架)
总结:先建6个包,在pulic中在建两个包:pages 和units

config 放配置文件,
data 可以新建excel 表格存数据
public 公共
pages 封装页面的公共方法那个
units 封装所有的工具类和函数
report 存放报告
run_all 运行测试用例
testcase 存放所有的测试用例

=============
‘’‘ini是一种配置文件
在ui自动化测试中配置文件的种类
ini、Excel、.py、yaml、txt’’’ (这些都是配置文件)
‘’‘1、先创建一个discz项目
在创建一个cofing包存放所有配置文件信息(比如项目路径和数据,用例的路径)
可以封装路径
在创建一个Data包放数据(测试数据)
在Data包中创建一个TestData目录(放测试数据)
测试环境的一些url地址和账号密码可以放在TestDta中
在创建一个repot包==存放测试报告
在repot包中创建一个Testrepot目录(存放报告)
在创建一个public公共公开的包(存放一些功能用例)
在public包中创建pages存放元素层流程层(封装所有页面的公共方法,基类)
在public包中创建utils包(处理公共类公共函数都存放在此)
可以在utils中来读取pages中封装的登录的流程(封装读取ini文件或者EXCEL表格的工具类和工具函数
在创建一个TestCase用例包用来存放用例
编写测试用例
在创建一个run_all用来运行
通过运行测试用例中封装好的用例在运行然后在repot中生成测试报告
框架的思想:把整个用例进行拆分
‘’’

============
建好了6个包以后

============

config包

我们先配置一个config包(在接着创建config.ini文件和globalconfig.py文件)

1、新建config.ini 文件
把我们的项目路径放进去去,在我们config文件中还要创建一个全局的项目路径

拓展:
也可以读取ini文件中配置信息
[env]

还有配置文件的参数要配置

2、globalconfig.py
配置所有包的项目路径,(我们要拿到当前项目的路径,)

#获取当前项目路径
project_path=os.path.dirname(os.path.dirname(file))
print(project_path)

以此类推:
把所有包的路径都拼接出来

import os
import time
from discuz.public.utils.ReadConfigIni import ReadConfigIni #导入ReadConfigIni类
#读取当前文件所在的路径
file_path = os.path.split(os.path.realpath(file))[0]
#print(file_path) #打印结果:E:\pycharm\discuz\config

#生成一个读取config.ini配置文件的对象
read_config = ReadConfigIni(os.path.join(file_path,“config.ini”))

#获取项目的绝对路径
project_path = read_config.getConfigValue(“project”,“project_path”)
print(project_path) #打印结果:E:\pycharm\discuz

#data数据的路径 os.path.join()函数可以把一个目录和一个文件/目录进行拼接
data_path = os.path.join(project_path,“Data”,“TestData”)
print(data_path) #打印结果:E:\pycharm\discuz\Data\TestData

#report报告的路径
report_path = os.path.join(project_path,“report”,“TestReport”)
print(report_path) #打印结果:E:\pycharm\discuz\report\TestReport

#TestCase测试用例的路径
TestCase_path = os.path.join(project_path,“TestCase”)
#(TestCase_path) #打印结果:E:\pycharm\discuz\TestCase

#生成生成测试报告的路径
now = time.strftime("%Y-%m-%d_%H_%M_%S") #生成时间戳
port_path=os.path.join(report_path,now+‘pot.html’)
#print(port_path) #E:\pycharm\discuz\report\TestReport\2020-11-26_16_26_33pot.html

===================================
utils (工具方法和工具类都封装在utils中)
我们要读取配置文件在utils工具类中创建(readconfigini.py文件)用来读取config.ini文件

开始我们编辑readconfigini.py 文件

#在python当中有一个模块configparser是用来处理ini文件
#pip install configparser #第一种安装方式
import configparser 我们首先导入 configparser 这个类
class ReadConfigIni: 定义一个类

def init(self,filename): 在构建一个函数
‘’’
这个工具类主要是用来读取ini文件的
:param filename:
‘’’
self.cf = configparser.ConfigParser() #创建configparser类的对象
self.cf.read(filename) #通过对象来调用 里面有个read的ini文件 (构造函数中的filename)

def getConfigValue(self,config,name):    #获取ini后缀结尾的文件内容'''读取section和option对应的value值'''value = self.cf.get(config,name)      定义一个calue,get中有一个section和optionreturn value![在这里插入图片描述](https://img-blog.csdnimg.cn/20210122212939747.png)

get中的

==================================
data包


新建data文件

在data文件中写入参数,url, username, password

============
readexcel 文件

在untis下创建一个读取excel文件的类
文件名:readexcel
思路: 1、 先封装一个类 2、拿到一个路径exce配置文件l路径

#xlrd这个模块是用来读取Excel文档的
#pip install xlrd 可以指定版本: pip install xlrd==1.2.0
import xlrd
import os
from discuz.config.globalconfig import data_path #导入data数据的绝对路径
#data_path的结果为:E:\pycharm\discuz\Data\TestData
class ReadExcel: 先封装一个类
def init(self,filename,sheetname):
‘’’
封装了读取Excel文档的工具类
‘’’
datapath = os.path.join(data_path,filename) #已经拿到了要读取的Excel文件绝对路径的文件名
self.workbook = xlrd.open_workbook(datapath) #读取Excel文档、并且生成一个对象
self.sheetName = self .workbook.sheet_by_name(sheetname)

def read_excel(self,rownum,colnum):'''封装了读取Excel文档具体行和列的工具方法 ,并且由行和列组成'''value = self.sheetName.cell(rownum,colnum).valuereturn value


以上是拿到账号和密码,

前面这些操作,就是为我们后面写用例提供数据

=================================

下面我们开始构建,写UI自动化用例
我们在想象我们之前的线性脚本的步骤:
ui自动化测试用例
(1)首先创建dricer对象,(2)通过driver对象来调用实例方法,(3)还要用到元素定位,点击,输入,下拉,关闭,获取文本。这些操作

public就是公共公开的意思
我们创建public包下的pages包下创建basetestcase ,这个basetestcase的用来干嘛?把所有页面公共公开的方法都封装在basepage这个基类当中

代码====
from selenium import webdriver #导入selenium 引用webdrvier方法
import time #导入time模块
import unittest #导入单元测试框架
class BaseTestcase(unittest.TestCase): 先定义一个basetest类,先创建类方法,我们讲过类开始和类结束,我们这里就用类方法。

#所有页面的公共方法都封装在BaseTestcase这个类中、简称基类一切类的父类需求打开浏览器-输入网址-定位百度输入框元素-输入内容-点击按钮’’’
@classmethod
def set_drvier(cls,driver):#设置drvier对象,需要保证每个用例的执行都是用的同一个drvier对象java当中的设计模块式-单例模式’’’,为什么这样做,保证,调用同一个driver对象
cls.driver=driver #cls.drvier就是BaseTestcase这个类的类变量’’’
# driver=webdriver.Chrome()#为了调试
@classmethod
def get_drvier(cls): #拿到driver对象
return cls.driver
@classmethod
def find_element(cls,element):#封装定位元素的工具方法包含id name class link xpath css等’’’
# baidu=(‘id’,‘kw’)==传元组 #我们定位百度输入框,使用id ,kw, ===》这个是page object 设计模式
type=element[0] #取element索引为0
value=element[1] #取element索引为1
try: #尝试运行这些代码如果代码报错抛异常
if type 'id’or type’Id’ or type ==‘ID’: #如果类型=id
elem=cls.driver.find_element_by_id(value)
elif type ==‘name’ or type ==‘Name’ or type ==‘NAME’:
elem=cls.driver.find_element_by_name(value)
elif type ==‘class’ or type ‘Class’ or type’CLASS’:
elem=cls.driver.find_element_by_class_name(value)
elif type ==‘xpath’ or type ‘Xpath’ or type’XPATH’:
elem=cls.driver.find_element_by_xpath(value)
elif type ==‘css’ or type ‘Css’ or type’CSS’:
elem=cls.driver.find_element_by_css_selector(value)
else: #其他的参数
raise NameError(‘请输入正确的参数’) #手动触发异常
except Exception: #如果上面代码定位元素出错,然后这里就会捕捉异常信息
raise NameError(‘捕捉异常’+str(element))
return elem #把元素返回上去,如果没有抛异常则把属性返回给类函数调用处本身

以上是所有的定位方法:输入元组输入什么方法就使用什么方法(定位方法,元素是什么)


除了元素定位,下面还有方法如send_keys
@classmethod
def send_keys(cls,element,text): #封装一个输入
element.send_keys(text) #找到元素后通过.send_keys输入text内容
@classmethod
def click(cls,element): #封装一个click点击
element.click()
@classmethod
def sleep(cls,sec): #封装了一个线程等待
return time.sleep(sec)
@classmethod
def max_window(cls): #封装了一个窗口最大化
return cls.driver.maximize_window()
@classmethod
def wait(cls,time):
return cls.driver.implicitly_wait(time)
@classmethod #封装一个关闭当前浏览器
def close(cls):
return cls.driver.close()

==============
看下如何运行的
下面我面建一个testcase

代码如下:

from discuz.public.pages.BaseTestCase import BaseTestcase #导入BaseTestCase类
import unittest
from selenium import webdriver
from discuz.public.utils.Login_Data import Login_Data as login #导入Login_Data类并且取别名为login
from discuz.public.pages.Page_Element import Page_Element as p #导入Page_Element类并且取别名为p
url = login.get_url() #拿到了url地址
username = login.get_username() #拿到了username的值为admin
pwd = login.get_password() #拿到了密码 123456
class TestLogin(BaseTestcase): #类的开始
@classmethod
def setUpClass(cls):
‘’‘测试之前的准备工作’’’
driver = webdriver.Chrome() #先创建一个driver对象
BaseTestcase.set_drvier(driver) #通过父类(BaseTestcase)调用set_driver类方法把driver对象传给父类作为类变量
@classmethod
def tearDownClass(cls): # 回到项目的首页
BaseTestcase.sleep(3)
def testLogin(self):
driver = BaseTestcase.get_drvier() #通过父类调用get_driver类方法拿到driver对象==》打开的浏览器
driver.get(url) #打开论坛的地址
driver.maximize_window() #最大化窗口
BaseTestcase.wait(20) #设置隐式等待
#1.输入用户名
userName = BaseTestcase.find_element(p.userName)
BaseTestcase.send_keys(userName,username)
#2.输入密码
passWord = BaseTestcase.find_element(p.passWord)
BaseTestcase.send_keys(passWord,pwd)
#3.点击登录按钮
loginBtn = BaseTestcase.find_element(p.loginBtn)
BaseTestcase.click(loginBtn)
#4.关闭当前浏览器
# BaseTestcase.sleep(4) #等待4秒
# BaseTestcase.close() #关闭当前浏览器
if name == ‘main’:
unittest.main()

多测师肖sir_金牌高级讲师_po设计(000)相关推荐

  1. 多测师肖sir_高级金牌讲师_app测试之环境安装(001)

    我们主要讲解app自动化环境的搭建以及定位和app测试 ================================================================ app 原生+ ...

  2. 多测师肖sir_高级金牌讲师_项目数据

    一.项目时间: (1)新项目:从无到有,从项目开始到上线的时间 (时间长) 一般3个月,6个月,一年,二年,三年 (2)迭代项目(时间短) 项目的版本的时间或周期 1个月,2个月,3个月 (3)敏捷开 ...

  3. 多测师肖sir_高级金牌讲师_jenkins持续集成测试(001)

    Jenkins操作手册 =================================================================== 一.jenkins介绍 1.持续集成(C ...

  4. 多测师肖sir_高级金牌讲师__python之常见if语句

    if判断语句: if单分支 格式: if 判断条件: 执行语句块1 else: 执行语句块2 if语句的判断条件可以用以下符号表示关系: 算术运算符:> ,<,==,>=,<= ...

  5. 多测师肖sir_高级金牌讲师_面试题

    1.冒烟测试是什么意思? 对主要功能,基本功能进行测试 2.你们公司的项目流程是什么? (1)H模型 H模型:拿到需求=编写测试计划=编写测试用例用例评审导入用例管理工具搭建环境开发提交代码包(达到准 ...

  6. 多测师肖sir_高级金牌讲师_linux命令一(2.4)

    linux中命令: (1)ifconfig :查看虚拟机ip地址 (2)ssh +ip地址 在输入账号,在输入密码 (3)pwd 查看当前路径 (4)/ 表示根目录 (5)~ root的家目录 (6) ...

  7. 多测师肖sir_高级金牌讲师_第2个月第18讲jenkins(001)

    Jenkins操作手册 =================================================================== 一.jenkins介绍 1.持续集成(C ...

  8. 多测师肖sir_高级金牌讲师_环境和环境面试题(13)

    (一) ================================================== (二)环境面试题: 1.请简述多有米环境的搭建.用到了哪些工具和流程介绍 2.查看当前端口 ...

  9. 多测师肖sir_高级金牌讲师_项目介绍之保险相关专业知识

    1.保险人:是指与投保人订立保险合同,并承担赔偿或者给付保险金责任的保险公司. 通俗讲就是卖给你保险的保险公司,就是某某保险公司. 2.  投保人:指与保险公司订立保险合同,并按照保险合同负有支付保险 ...

  10. 多测师肖sir_高级金牌讲师_测试理论之IT常见术语(1.2)

    IT常见基本术语 1.硬件: 计算机的硬件是计算机的各种设备的总称:硬件分为5个部分: (1)运算器 cpu (2)控制器 主板 (3)存储器 硬盘 (4)输入设备 :键盘 鼠标 (5)输出设备: 显 ...

最新文章

  1. nginx后端节点健康检查
  2. C++中int id[sizeof(unsigned long)]的语句,正确吗?
  3. Scrapy复习总结
  4. python 执行shell_python中执行shell的两种方法总结
  5. flask.Blueprint
  6. React Native 系列(七) -- ListView
  7. CAD迷你看图 for Mac
  8. 前端js使用java变量值_web前端:js中的变量
  9. 【数据库】NoSQL数据库简介
  10. 从Master到百度《最强大脑》人机大战:AI成坊间话题意味着什么?
  11. 《模拟电子技术基础》课程笔记(九)——互补对称式功率放大电路
  12. 如何删除github中的提交历史记录
  13. ACL(访问控制列表)
  14. “D语言风采不再”的说法言过其实
  15. 作业4 | Lloyd-Max标量量化器DCMP基本原理
  16. 游戏运营之数据的重要性
  17. 知识付费的8个小问题
  18. 郭敬明的一个人的城市
  19. React实现(Web端)网易云音乐项目(五),错过了真的可惜呀
  20. thunderbird收件箱只显示邮件个数,无法打开邮件

热门文章

  1. 最小项标准式和卡诺图化简
  2. 谁说不同品牌内存无法兼容-关键调整频率和内存时序
  3. HVIDB!人类病毒蛋白互作数据库介绍
  4. sql解决数据库日志文件过大的问题
  5. 面试官问:“你还有什么事想问的?” 该怎么回答?
  6. 在线裁剪图片 Jcrop
  7. mysql多表join方式
  8. 过去分词做宾语补足语
  9. DWZ 富文本编辑器 IE下失去焦点
  10. 2018年腾讯社交广告大赛复习总贴