拓冰建站拓冰建站
首页 / 资讯中心 / 正文

我的项目整理

自动化相关1.从0-1搭建一个自动化测试工程首先是工具的选择上是基于PythonrobotframeworkPython语言主要用于实现自动化的接口robotframework是调用Python中的接口实现的测试自动化其中关于工程搭建中的一个点是使用虚拟环境安放自动化工程中的库venv目录下放的库和使用方法关于虚拟库怎么使用以及虚拟中都有些什么以及相关配置说明一下关于PyVISA是 Python 中用于控制各类测试测量仪器的核心库import pyvisa的使用怎么使用的怎么连接的测试仪表step1:self.rm pyvisa.ResourceManager()step2:inst self.rm.open_resource(fTCPIP0::{ip}::5025::SOCKET)通过IP与测试仪表建立起连接之后就可以通过下发命令实现对测试仪表的控制比如设置VSG参数并开始发包关于multiserver multiclient 是怎么与对端建立起连接并在对端执行命令的首先在multipc_client.py先class multipc_client():def mc_conn(self, ip, port, timeout10):print(fmc_conn {ip}:{port})self.s socket.socket()port int(port)for i in range(0, timeout):try:self.s.connect((ip, port))recv self.s.recv(1024)except:time.sleep(1)continueelse:# return self.s.recv(1024)print(server return:, recv)return recvlogging.error(f连接{ip}:{port}失败)return MOMO_ERR通过socket套接字建立起连接然后通过套接字socket发送消息self.s.send((message).encode())return self.s.recv(1024).decode()之后我就可以在自己的需求里要进行的对面的操作比如我先与对端电脑建立起连接先声明client multipc_client()然后调用连接函数mc_conn(ip,port)建立起连接之后发送关键字给对端电脑result client.mc_send(mc_multil_users_testcases_config_1)1.selenium(1)selenium是python的一个第三方库用于web应用程序的测试工具直接运行在浏览器中就行真正的用户一样支持firefox、safari、google Chrome等浏览器(2)selenium用来UI自动化用来模拟用户手工操作UI页面方式用代码实现自动化操作和验证的行为(3)selenium的核心是webdriver,webdriver是按照client-server原理设计client简单来说就是我们写的代码以http请求的方式发送给server端serve端接收请求执行相应操作然后返回给client端代码实现步骤1导入第三方库from selenium import webdriver -----启动浏览器并控制浏览器的前进后台、打开关闭from selenium.webdriver.common.by import By -----定位页面元素按钮、输入框、文字,常用方式By.ID、By.NAME、By.CLASS_NAME、By.XPATH、By.CSS_SELECTORfrom selenium.webdriver.support.ui import WebDriverWait -----智能等待from selenium.webdriver.support import expected_conditions as EC -----等待条件等到元素可点击、可看见、存在如EC.element_to_be_clickable、EC.visibility_of_element_located、EC.presence_of_element_located四者关系webdriver → 打开浏览器By → 找元素WebDriverWait → 等页面加载EC → 等待的条件2先创建chrome浏览器实例然后打开Chrome浏览器chromedriver_path os.path.join(os.path.dirname(__file__), chromedriver.exe)service Service(executable_pathchromedriver_path)self.driver webdriver.Chrome(serviceservice)self.driver.get(self.web_url)3等待元素存在格式EC.presence_of_element_located((定位方式定位表达式))input_boxWebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,kw)))3.1判断元素里是否包含了指定的元素格式EC.text_to_be_present_in_element((定位方式定位值)“要检查的文本”)WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.ID,msg),登录成功))3.2EC.element_to_be_clickable4查找元素targetdriver.find_element((By.id,kw))5输入文字input_box.send_keys(你好)6点击操作target.click()关于我自己写的三种路由器中设置无线信道流程上是在chrome浏览器打来网址登录后在专业模式-wifi-wifi射频配置中设置无线信道的值然后手机连接上该wifi然后打流在点击操作相关的进行了接口的封装如def wait_and_click(self,xpath,desc元素):[函数描述]等待元素出现可点击try:self.wait WebDriverWait(self.driver, 5)elemself.wait.until(EC.element_to_be_clickable((By.XPATH,xpath)))elem.click()然后self.wait_and_click(xpath/html/body/div/div[1]/div[1]/div[2]/div[2]/span[2], desc选择专家模式)# 获取ssidelem_ssid self.driver.find_element(By.XPATH, /html/body/div[1]/div[2]/div[4]/div/form/div[2]/span/input)ssid elem_ssid.get_attribute(value)********************************************************************************************************************************************2.adb相关整理--电脑通过adb连接手机执行相关命令操作安卓手机的接口1创建一个AdbClient客户端连接电脑上的ADB服务clientAdbClient(host127.0.0.1port5037) host127.0.0.1意思就是连接本地电脑2与手机建立起连接锁定要操作的手机deviceclient.device(target_serial) 根据序列号拿到手机对象3在手机上执行命令check_wlandevice.shell(cmd wifi status) device.shell是指在手机执行命令安卓系统查看wifi状态的命令cmd wifi status将手机WLAN开的命令cmd wifi set-wifi-enabled enabled连接指定wifi的命令cmd wifi connect-network {ssid} {security} {password}失败自动重启机制 retry装饰器是python的retrying库retry(stop_max_attempt_number3, wait_fixed3000, retry_on_resultlambda x: not x)********************************************************************************************************************************************3.ixchariot是网络设备跑分工具能测试网络的吞吐量 延迟、丢包等---ixchariot不支持直接用python控制只能用Tcl语言控制ixchariot官方只提供TCL API所以python脚本的本质是启动一个Tcl解释器程序(tclsh.exe)--运行Tcl脚本(ixchariot_initial.tcl)--让Tcl去控制ixchariot.tcl文件是专门用来控制ixchariot、交换机、路由器的脚本语言1python脚本在这里的作用只是创建一些配置项比如指定测试两端的IP安装的tcl解释器的路径.tcl文件的路径和测试结果的路径另一个作用就是起一个线程subprocesss.run启动安装到本地的Tcl解释器程序(tclsh.exe)去运行Tcl脚本2关于TCL脚本掌握TCL基础语法包括创建变量set a 10、 参数传递set ip [lindex $argv 0] $argv是从外部传入的参数列表lindex取第N个参数 、循环for {set i 0} {$i 10} {incr i}{} TCL的for循环固定格式用来批量创建流量对、异常捕获if {[catch {命令} error]}独立编写ixChariot自动化脚本完成测试创建set test [chrTest new]、设置运行时长chrRunOpts set $runOpts TEST_DURATION 10、启动测试chrTest start $test、读取吞吐量结果chrPairResult get $pair THROUGHPUT可以实现python与TCL联合自动化实现超时保护if {![chrTest isstopped $test $timeout]}、日志存储(open $logpath w chrtest save $test file.txt)、释放资源chrTest delete $test close $fp、输出吞吐量(读取TCL脚本的执行结果获得)等********************************************************************************************************************************************4.robotframework测试框架和Pytest测试框架robotframework是基于Python的通用自动化测试框架采用关键字驱动或者数据驱动即把用例逻辑和测试数据分离支持变量、循环、判断、数据驱动自动生成html报告适合快速搭建自动化体系核心结构1Settings:导入库、资源、配置2Variables变量3test case测试用例4keywords:自定义关键字封装重复步骤RF工作原理RF读取.robot用例文件解析关键字调用对应库执行真正的操作最后生成日志报告输出XML本质上RF是调度器库是干活的用例是指令关于变量有普通变量${a}列表变量{list}字典变量{dict}关于循环for ${i} in range 5log ${i}关于if判断${a} set variable 10if ${a} 5log 大于5eleslog 小于5关于关键字库关键字 用户自定义关键字封装的、内置关键字Log、sleep关于断言should be Equal ${a} ${b}should Contain ${str} abcshould be True ${a}10关于失败重跑rebot关于RF报告生成是三个文件output.xml执行结果数据log.html 详细日志report.html汇总测试报告关于RF是如何调用Python代码1.在RF中通过Library导入Python文件2.直接调用Python函数作为关键字我熟悉 RF 的基本结构Settings、Variables、TestCases、Keywords 掌握RF 变量、循环、判断、自定义关键字、传参、返回值、标签运行、失败重跑等用法能够独立编写、维护自动化用例也能结合 Python 扩展关键字。优化处理写一个脚本实现失败用例重跑首先执行用例的命令是robot -d {result_dir} -o output.xml -i {target_tag} {target_testcases_path}只执行失败用例的命令是 robot -d {result_dir} -o rerun.xml --rerunfailed output.xml {target_testcases_path}将两次执行的结果合并到一个报告里的命令是rebot --merge -d {result_dir} output.xml rerun.xml按照这三个命令分别创建三个方法subprocess.run()即可完成Pytest测试框架是********************************************************************************************************************************************WT448WIFI测试仪控制封装是通过SCPI协议和VISA库与硬件进行通信SCPI协议指令是用来控制仪器的pyvisa是python控制仪器的标准库负责建立连接收发字节实现方式是python通过标准库pyvisa调用VISA驱动发送SCPI协议指令控制硬件仪器WT448仪表是 “能发、能收、能跑 Wi‑Fi 协议” 的综合测试仪1.与仪器建立连接self.rmpyvisa.ResourceManager() --step1创建一个仪器资源管理中心用于让电脑能够扫描、识别、管理所连接的仪器USB、网口、串口等infoself.rm.open_resource(fTCPIPO::{ip}::5025::SOCKET) --step2通过网口TCP/IP打开指定IP地址的仪器建立通信连接拿到通信对象idn_info inst.query(*IDN?) --step3: 读操作 发送指令读取仪器ID用于确认仪器通信正常write_info info.write(WT:SYSTem:CMD:RESPonse 0) --step4 写操作 关闭响应回显更多读写操作发包配置用写操作info.writefWT:SENSe:CONFigure:RFPOrt {rf_port 1} # 配置 VSA 采集数据的 port口info.writefWT:WIFI:SENSe:CONFigure:ANALy:BANDwidth:MODE 0, # 设置带宽识别模式收包解析用读操作设置读取返回数据的类型info self.inst.read_raw() # 读取返回原始字节info self.inst.query_ascii_values(cmd) # 自动把仪器返回的字符串解析成数字2.优化处理创建专门给仪器用的异常类让程序可以抛出我们自己的错误信息以便定位在python中系统自带错误如ValueError、TypeError、OSErrorclass WT_ScpiError(Exception): ---- 继承python自带的异常功能捕获、抛出、打印的能力def __init__(self, message): ----用构造函数__init__创建对象时自动执行用于传入错误信息messageself.message message ----把外面传进来的message传到当前对象的属性self.meaasge里super().__init__(self.message) ----super调用父类也就是Exception __init__调用父类的构造函数 用于让python原生系统知道这是异常并且错误信息是message没有这一行这个错误就不能正常抛出def __str__(self): ---- 魔术方法__str__当打印这个错误对象时python会自动调用这个函数return f{self.message} ----返回保存好的错误信息想让程序主动报错时这样写raise WT_ScpiError(仪器连接失败)3.业务逻辑VSG 发包通过下发命令配置要发送的包的格式和条件如比我要发送射频标准802.11ax、射频带宽为20M、中心频率为36/5180MHz发送次数为200次的包测试仪按照配置的参数自动生成并发射无线信号VSA 收包按照VSG的相关配置VSA也同样配置如射频标准、中心频率等来捕获对应要解析的无线信号对信号进行解调、解码、帧解析返回信道质量、EVM、频谱等指标这些指标是通过调用SCPI指令进行配置下发和查询获取的********************************************************************************************************************************************信尔泰仪表关于进程、线程、多进程、多线程的理解进程分为主进程、子进程当运行一个aa.py文件的时候操作系统就拉起一个进程这个进程独占内存、CPU、网络资源创建子进程subprocesss.run()主进程和子进程是两个独立的进程各自有独立的内存默认互不共享数据subprocess.run()是阻塞式会阻塞主进程的执行等子进程执行完退出才会接着执行主进程sunprocess.Popen()非阻塞启动子进程后主进程立刻继续跑适合后台常驻程序用途如调用外部工具执行adb命令系统命令多进程相互独立内存完成隔离创建子进程p1mulprocessing.Process(targettask1)p2mulprocessing.Process(targettask2)mulprocessing是Python内部创建的子进程跑Python代码subprocess是Python调用系统外部系统本质上是拉起系统子进程线程是进程内部的执行单元,一个进程里可以创建多个进程共享进程的所有内存CPU资源Python特有GIL全局解释器锁规定同一时间一个进程内只有一个线程能使用CPUbbthreading.Thread(targettask) 创建线程bb.start() 启动线程多个线程同时跑bb.join() 让主线程等待子线程结束再继续往下执行多线程一个进程里可以分出多个线程共享当前进程的所有资源创建多线程t1threading.Thread(targettask1)t2threading.Thread(targettask2)执行多线程t1.start()t2.start()等待两个线程执行完毕t1.join()t2.join()什么情况下会出现KeyError 、TypeError、alueError以int(a[x])为例当键‘x’ 不存在时报错keyerror当键x不是str float int bool这样可以调用int函数构造int类型的对象时会报错typeerror当值a[x]是字符串或者列表这样的无法处理正int时报错ValueError关于传参是可变类型的处理1.当函数定义时看可变对象默认参数列表\字典只创建1个所有不传该参数的调用共用同一个对象2.调用时手动传入列表会用全新独立列表不共用全局默认对象3.共用的列表每次append都会叠加内容所有接收它的变量值会同步变化如何读取大文件例如内存只有4G 怎么读取8G的文件方法1逐行读取with openfile.txt,rbas f:for line in f:pass方法2固定分块读取chunk_size1024*1024 #自定义每次读取1MBwithopenfile.txt.rbas f:while True:chunkf.read(chunk_size)if not chunk: #读到文件末尾退出循环breakprocess(chunk) #处理片段关于模块和包的理解一个python文件就是一个模块而保存这些模块的文件夹就是一个包但是这个作为python包的文件夹里必须要有一个__init__.py文件否则无法导入这个包模块和包解决了Python中的命名问题不同的包里可以有同名的模块不同的模块下可以有同名的变量、函数或类。线程池的理解
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门