您的位置:首页 >iEAS系统 >

测试小游戏大全(日网超准爬格子游戏心理测验!选一条路线,测潜在竞争心多强)

导读 测试小游戏大全文章列表:1、日网超准爬格子游戏心理测验!选一条路线,测潜在竞争心多强2、写一个适合自己游戏的简单的协议测试接口测试工具/抓包工具3、5款游戏测试显示 A

测试小游戏大全文章列表:

测试小游戏大全(日网超准爬格子游戏心理测验!选一条路线,测潜在竞争心多强)

日网超准爬格子游戏心理测验!选一条路线,测潜在竞争心多强

#冬日生活打卡季#

每个人的性格中都有一些隐藏面,而这些潜在性格常常会在我们下意识的选择中显露出来~日网就有一则「爬格子游戏」心理测验,只要透过你选择的爬格子路线,就可以测出测你人格潜在的竞争心有多强~一起来测测看这则心理测验吧!

你正在玩爬格子,请仔细观看以下6条路线,并选择一条你想走的。

图片来源:curazy

下滑看解析↓

.

.

.

.

.

1号路线:潜在竞争性20%

选择1号路线的人竞争心是20%。你在重要场合时容易感到焦虑、害怕,尤其当你越想要做好时,就越容易出错。虽然你并不擅长与人竞争,但是敬业和勤奋却是你的魅力,也许在短时间内看不到成绩,但是只要慢慢积累,你的努力就会开花结果。

2号路线:潜在竞争性80%

选择2号路线的人竞争心是80%。你讨厌输的感觉,因此在竞争、比拼时你会比其他人更认真,这种一心想赢的执念甚至会让对手感到害怕。为了获得胜利你能够不择手段,对于过程很较真、不会羞于承认自己想赢的内心,这大概就是你能获得胜利的关键。

3号路线:潜在竞争性0%

选择3号路线的人,竞争心是0%。你的内心住着一个敏感细腻、体贴又温柔的人,因此在竞争时你往往会选择让对手赢得胜利。并不是你没有争赢的能力,而是你本来就不喜欢争吵的感觉,希望能尽量避免争执、透过沟通讨论解决事情。如果必须集体做出决定时,你通常是打破僵局的人,因为比起自己的胜利,你更希望周围的人幸福。

4号路线:潜在竞争性60%

选择4号路线的人,竞争心是60%。你不是那种积极争取胜负的类型,但是一旦你认真起来,企图心就会非常强。意外的是,你有一颗冷静自持的心,因此能够不急不躁、冷静地规划自己的行动,以胜利为目标前进。即使中途失败,你也不会沮丧,而会冷静地分析失败原因。无论身边的人有多不耐烦,你都不会忘记自己要的是什么。

5号路线:潜在竞争性100%

选择5号路线的人,竞争心100%。你是那种在竞争时能够拿出120分力量的类型,将所有的紧张转换为肾上腺素,相信自己绝对能胜利,这样的自信和决心是你的优势。到目前为止,你也总是战无不胜。这种竞争并不会让你感到压力,你反而非常乐在其中,像玩游戏一样享受这样的时刻。

6号路线:潜在竞争性40%

选择6号路线的人,拥有40%的竞争心。你比较追求完美,有时甚至有点神经质,对于小细节斤斤计较,一点点小错误往往就会让你感到不耐烦,这样的性格让你很难在与人竞争时保持冷静。因此对你来说,比起和别人争胜负,你宁愿和自己战斗,在获得自己满意的结果之前,你会一直努力前进。

写一个适合自己游戏的简单的协议测试接口测试工具/抓包工具

曾几何时,wpe 是一个网络游戏抓包神器,我们在做协议测试的时候,也是通过 wpe 来抓包、改包和发包,来测试服务器对于非法协议的处理逻辑是否正确。wpe 操作简单,只需要加载进程,启动抓包,停止抓包就能看到所有与服务器之间的封包记录,但美中不足的是,wpe 抓取的封包内容全部是 16 进制显示,有时候我们需要改动某个字段,还需要先破译并找到字段位置来做修改,可读性比较差。


随着时代的发展,现在的游戏做了很多的安全措施,wpe 已无法找到目标游戏的进程,其他的抓包工具也很少有能满足测试需求的。而且,我们公司的测试组有自己编写的机器人,在之前,客户端和服务端之间详细的交互逻辑,我们知道的并不是很清楚,比如我执行一个操作之后,客户端会发送哪些协议,会收到哪些协议返回?协议的先后顺序是怎样的?在不知道这些信息的时候,机器人的脚本行为编写很慢,效率也比较低。

为了更好地配合机器人脚本的编写,以及针对我们的游戏项目进行协议测试,我们写了一个简单的小工具来达到显示封包收发过程以及插包改包来验证服务器逻辑的目的(PS:仅适合针对自己公司内部项目,因为需要知道协议文档嘿嘿),通过这个工具,客户端与服务端的每一条协议交互,都会按照先后顺序进行明文显示,这样在我们编写机器人行为的时候,也能够帮我们更好的梳理机器人协议发送的流程,更快的完成行为方法的编写,另外因为进行了明文显示,在协助我们做协议测试方面也比 wpe 更好。接下来我们来实现这个抓包发包工具。

首先我们分析一下 wpe 的原理(个人猜测,如有问题欢迎指正):

图有点乱,不过它大概是下面这样的:
 1.wpe 加载客户端进程,然后将修改后的 dll 注入到客户端进程,hook 客户端的 send 和 recv 方法调用。
 2.客户端进行发包操作,协议在通过客户端的 socket 时,会通过注入的 dll 进行处理,然后再发给服务端(处理可能包括拦截、修改等)。
 3.服务端在返回封包之后,也会通过客户端的 socket,调用 dll 进行处理,然后再发给客户端。
 4.wpe 可以直接插入伪装包,通过 dll 调用直接将伪装的封包通过客户端的 socket 发给服务端。

这里面最关键的是 dll 注入和 hook 钩子,不过这两个我研究了一阵子,没研究懂,所以我不会,尴尬...不过没关系,接下来我们换一种思路来做。

首先来分析一下我们想要的功能,请看下图(图片仅供参考,但需要自行使用 QT 设计一个类似的界面出来):

这个是目前已经做出来的一个小工具,大概分了几个区块:


 1.目标服务器:就是游戏需要登录的那个服务器地址
 2.进制转换功能:做这个东西主要是为了方便解读十六进制,当时用 wpe 测试的时候,解析字节流太繁琐了,产生了心理阴影。
 3.协议生成和发送:可以填入协议号和参数组自动生成十六进制的协议,也可以模拟发送,实现 wpe 的插包功能。
 4.其他功能:其他想要实现的辅助测试的功能,需要自己写。
 5.协议记录:发送协议和接收协议的全部记录。
 6.日志:记录一些过程和错误内容。
 7.代理:工具的核心,实现所有的协议转发和修改功能。

刚刚讲到了,dll 注入有点难,我们需要换一种思路,上面这个小工具我是用代理 agent 的方式来实现的,原理图如下:

从图中可以看到,原本客户端与服务器是通过 socket 直连的,但是我们无法注入 dll 的话,就无法对收发过程进行干预,所以我们就需要在他们之间加一个代理,客户端发给服务器的包,先发到代理这里,然后代理再转发给服务器,同样的,服务器发给客户端的包,也是先发到代理这里,然后再转发给客户端。由于代理的功能是我们自己来实现的,所以在接收到客户端发给服务器的或者服务器返回的封包时,我们可以对其进行任意的修改。

接下来我们需要设计工具界面,并实现这个工具的各个功能:

一、代理
由于各个模块都与代理的功能挂钩,所以我们先实现代理的功能,以便后续关联 UI 的时候方便调试。


先来看下代理原理分析图:

1. 代理 server 启动监听,当客户端尝试连接服务器的时候,创建一个代理与客户端之间的链接 C_A_socket。
2. 然后创建一个代理与服务器之间的链接 S_A_socket。
3. 调用代理的 start 方法,启动发包、收包、解析等线程。发包线程持续从 C_A_socket 处 recv,收到协议之后根据需求进行一定的处理 (修改、拦截等),然后从 S_A_socket 处 send 给服务器,收包线程刚好相反,从 S_A_socket 处 recv,然后从 C_A_socket 处 send 给客户端,完成协议的转发。解析线程是将收发协议进行明文化解析,显示到工具上,方便查看。

接下来我们来实现代理的功能:

首先我们写一个 AgentServer 类,这个类启动后,绑定一个本地端口并进行监听,当监听到客户端连接后,启动一个代理实例。

class AgentServer: def __init__(self, agent_port, server_host, server_port, ui): """ agent_server初始化 :param agent_port: 本地代理的绑定端口 :param server_host: 服务器的ip :param server_port: 服务器的端口 """ self.ui = ui # 工具ui,后面跟工具做关联的时候会用到 # 初始化一个socket self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将socket绑定本地ip和端口进行监听 self.socket.bind(('127.0.0.1', agent_port)) self.socket.listen(5) self.server_host = server_host self.server_port = server_port # 生成一个空的代理对象 self.agent_obj = None def start(self): """ 启动agent_server,等待客户端的链接请求 :return: """ while True: # 等待客户端连接后获取到与客户端的socket client_socket, addr = self.socket.accept() # 创建一个与服务器连接的socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.connect((self.server_host, self.server_port)) # 生成一个代理实例,将client_socket和server_socket传给代理 self.agent_obj = socket_agent(client_socket, server_socket, self.ui) # 启动代理 self.agent_obj.start() def stop(self): """ 停止agent_server,关闭socket监听,并停止agent :return: """ # 关闭agent_server的socket self.socket.close() # 停止agent_obj self.agent_obj.stop()接下来我们写一个代理类,Agent,并实现它的 start 和 stop 方法。

class Agent: def __init__(self, client_socket, server_socket, ui): """ 初始化一个agent代理 :param client_socket: 与客户端之间的socket连接 :param server_socket: 与服务器之间的socket连接 """ self.ui = ui # 工具ui,后面跟工具做关联的时候会用到 self.client_socket = client_socket self.server_socket = server_socket self.sock_Num = 0 # 验证码,游戏发包验证 self.send_data = b'' # 发送协议包池 self.recv_data = b'' # 接收协议包池 self.alive = True # 是否存活 self.hide_proto = False # 是否屏蔽协议 self.loop_send = False # 循环发送状态 start 方法后面再写,先写一个 stop 方法def stop(self): """ 停止转发器,关闭所有线程 :return: """ self.alive = False try: self.client_socket.shutdown(2) self.client_socket.close() except Exception as e: print('socket 关闭时出现了异常', e) try: self.server_socket.shutdown(2) self.server_socket.close() except Exception as e: print('socket 关闭时出现了异常', e)

写一个客户端协议处理方法,从客户端处持续 recv 字节流,并放入包池中。这里不直接把字节流转发给服务器,因为我们可能需要对它做一些处理,如修改发包顺序验证码等。

def agent_clinet_to_server(self): """ 处理客户端发送给服务器的包 1.获取客户端发起的字节流 2.将字节流全部粘贴在一起进行后续处理 3.此处不调用server socket进行转发,因为发送协议需要进行一些特殊的处理 4.循环此步骤 :return: """ # 首先判断agent是否存活状态 if self.alive: try: # 从客户端处接收字节流 data = self.client_socket.recv(65535) if data: # 将收到的字节流放入包池中等待后续处理 self.send_data = data # 重新调用这个方法接收客户端的封包 Timer(0, self.agent_clinet_to_server).start() else: print('收到了空字节流,socket连接可能已经断开', data) except OSError as e: # 如果触发了OSError异常,说明socket可能已经断开了 self.alive = False print('连接已断开!', e) except: Timer(0, self.agent_clinet_to_server).start() 

写一个服务器协议转发方法,从服务器持续 recv 字节流,并放入包池中待解析,然后收到的字节流直接转发给客户端,因为服务器返回的协议我们无需特殊处理。

def agent_server_to_client(self): """ 处理服务器发送给客户端的包 1.获取服务器返回的字节流 2.将字节流全部粘贴在一起进行后续解析显示 3.调用client socket,将服务器返回的字节流直接转发给客户端 4.循环此步骤 :return: """ if self.alive: try: # 从服务器处接收字节流 data = self.server_socket.recv(65535) if data: # 通过client_socket直接转发给客户端 self.client_socket.send(data) # 同时将受到的字节流放入包池中等待解析 self.recv_data = data # 重新调用这个方法接收服务器的封包 Timer(0, self.agent_server_to_client).start() except OSError as e: # 如果触发了OSError异常,说明socket可能已经断开了 self.alive = False print('连接已断开!', e) except: Timer(0, self.agent_server_to_client).start()

接下来写一个修改发送包,转发给服务器并显示到 UI 上的方法,在这个方法里面调用了两个外部方法,分别是 edit_bytes 和 make_send_proto_msg。

edit_bytes 方法是将原本的客户端协议替换发包顺序验证码(比如验证码的顺序在客户端那里是自加 1,如果我们插个包发给服务器,要修改这个验证码 1,但是客户端自身的验证码还是原来那个,所以会导致后面的协议验证码冲突,简单粗暴的做法就是所有的验证码都从代理工具生成,客户端发过来的协议验证码被无条件替换)。

make_send_proto_msg 方法是将协议 obj 转化成一个解析后的字符串 (具体可以看上面那个工具图的协议接收和发送记录那里,我是直接调用的协议文档转成的 python 文件,由于涉及到文档内容,这里没有列出,请见谅,这里只要实现一个方法,将协议封包对象明文显示即可),解析错误的话就将错误信息发送到日志文本展示框那里进行展示,这两个方法的具体实现逻辑这里就不写了。

def get_and_analyze_one_send_proto(self): """ 拆解一个发送包并进行明文化显示到工具UI上 然后将这个包做一定修改后发给服务器 :return: """ if self.alive: # 做一下封包完整性判断(7是根据协议结构来的) while len(self.send_data) >= 7 and self.alive: # 获取协议的协议长度 length = struct.unpack("!H", self.send_data[0:2])[0] # 判断是否能拆解出一个完整的封包 if length <= len(self.send_data) - 7: # 通过edit_bytes编辑验证码并重新序列化协议 # PS:由于插包会改变原本的协议顺序验证码 # 所以我们让所有的封包都按照我们的验证码规则来 send_data, proto, self.sock_Num = edit_bytes( self.send_data[0:7 length], self.sock_Num) # 将修改后的协议通过server_socket发送给服务器 self.server_socket.send(send_data) # 判断是否屏蔽协议 if not self.hide_proto: # 将通过make_send_proto_msg方法解析的协议内容显示到ui上 self.ui.textBrowser_send.append( make_send_proto_msg(proto, send_data)) # 截取包池,抛弃已经处理的字节流 self.send_data = self.send_data[7 length:] # 重新调用此方法 Timer(0, self.get_and_analyze_one_send_proto).start() 

写一个解析接收包,并显示到 UI 上的方法,make_recv_proto_msg 方法同样是将协议 obj 转化成一个解析后的字符串,解析错误的话就将错误信息发送到日志文本展示框那里进行展示,同样的,这个方法的具体实现逻辑这里不再说明。

PS:这两个方法中的 6 和 7 是根据项目的协议格式来的,我们项目的格式是 16 位的协议长度,32 位的协议 id,8 位的验证码,因此是 2 4 1=7,由于服务器返回的协议不需要验证码,所以是 6

def get_and_analyze_one_recv_proto(self): """ 定义一个拆包并解析这个包的方法 服务器返回的包我们在recv的时候已经直接转发了,所以这里没再转发 :return: """ if self.alive: # 做一下封包完整性判断(6是根据协议结构来的,比上面少了1位的验证码) while len(self.recv_data) >= 6 and self.alive: # 解析出协议的长度和协议号 length, proto = struct.unpack("!HI", self.recv_data[0:6]) # 判断是否能拆解出一个完整的封包 if length <= len(self.recv_data) - 6: # 判断是否屏蔽协议 if not self.hide_proto: # 将通过make_recv_proto_msg方法解析的协议内容显示到ui上 self.ui.textBrowser_recv.append(make_recv_proto_msg(proto, self.recv_data[0:6 length])) # 截取包池,抛弃已经处理的字节流 self.recv_data = self.recv_data[6 length:] # 重新调用此方法 Timer(0, self.get_and_analyze_one_recv_proto).start() 写一个发送伪造包的方法。def agent_insert_send(self, data, times=1, sleep_time=100): """ 插入一个伪造的数据包,并发送 :param data:伪造的数据包 :param times:发送次数 :param sleep_time:间隔时间 :return: """ try: if self.alive: if times: for i in range(times): data, proto, self.sock_Num = edit_bytes(data, self.sock_Num) self.server_socket.send(data) time.sleep(sleep_time/1000.0) else: while self.loop_send: data, proto, self.sock_Num = edit_bytes(data, self.sock_Num) self.server_socket.send(data) time.sleep(sleep_time / 1000.0) except Exception as e: print("请先开启客户端并连接服务器!", e) 

最后我们再回头写 start 方法。

def start(self): """ 启动转发线程 启动拆包解包线程 :return: """ Timer(0, self.agent_clinet_to_server).start() Timer(0, self.agent_server_to_client).start() Timer(0, self.get_and_analyze_one_send_proto).start() Timer(0, self.get_and_analyze_one_recv_proto).start()

至此,agent_server 和 agent 就写完了,接下来我们让他俩跟 UI 进行绑定。

二、模块绑定

1.服务器相关区块:

PS:以下方法是写在界面类下面的。

- 界面初始化的时候进行按钮点击事件绑定:

# 绑定启动服务按钮事件self.ui.start_btn.clicked.connect(self.wpe_start)# 绑定停止抓包按钮事件self.ui.stop_btn.clicked.connect(self.wpe_stop)

- 实现这两个点击事件的方法,和配套的 QT 线程:

def wpe_start(self): """ 启动中转代理agent_server,等待客户端连接 :return: """ try: from pyqt_thread import begin_agent_service self.agent_thread = begin_agent_service(From=self) self.agent_thread.start() except Exception as e: print('启动失败!出现了异常', e)def wpe_stop(self): """ 停止中转socket,关闭全部socket连接 :return: """ self.ui.textBrowser_send.append("*********服务已停止********") self.ui.textBrowser_recv.append("*********服务已停止********") self.agent_server.stop()class begin_agent_service(QThread): """ 启动转发代理的thread类 """ def __init__(self, parent=None, From=None): super(begin_agent_service, self).__init__(parent) self.ui = From def run(self): # 获取server_ip, server_port, my_port server_ip = self.ui.ui.ip_edit_line.text() server_port = self.ui.ui.port_edit_line.text() my_port = self.ui.ui.host_port_edit_line.text() if server_ip and self.ui.ui.host_port_edit_line.text() and self.ui.ui.port_edit_line.text(): if self.ui.get_server_ip(): # 提示开始 self.ui.ui.textBrowser_send.append( "*********代理已启动,请开启游戏**********") self.ui.ui.textBrowser_recv.append( "*********代理已启动,请开启游戏**********") # AgentServer实例 self.ui.agent_server = AgentServer( int(my_port), server_ip, int(server_port), self.ui) Timer(0, self.ui.agent_server.start).start() print('服务已启动') else: # 加个ip格式错误提示 for i in range(10): self.ui.ui.ip_edit_line.setText('ip格式错误!') time.sleep(0.05) self.ui.ui.ip_edit_line.clear() time.sleep(0.05) self.ui.ui.ip_edit_line.setText(server_ip) else: # 加个参数错误提示 for i in range(10): self.ui.ui.ip_edit_line.setText('三参不能为空!') time.sleep(0.05) self.ui.ui.ip_edit_line.clear() time.sleep(0.05) self.ui.ui.ip_edit_line.setText(server_ip)

2.进制转化区块
输入格式参考的是 wpe 那种显示格式,因为当时做的时候主要是针对 wpe 数据进行解析用的。

- 按钮点击事件绑定

# 绑定转换int按钮事件self.ui.h2i_btn.clicked.connect(self.on_h2i_btn_click)# 绑定转换str按钮事件self.ui.h2s_btn.clicked.connect(self.on_h2s_btn_click)

- 实现这两个事件的方法

def on_h2i_btn_click(self):"""点击转换为int按钮之后的处理方法读取文本框中的16进制内容,转换为int类型:return:"""# 获取文本框中的内容try: msg = self.ui.hex_input.toPlainText() result = str(int(msg.replace(" ", "").lower(), 16)) self.ui.hex_tran_result.setText(result)except: self.ui.hex_tran_result.setText('输入内容有误,请检查!!!')def on_h2s_btn_click(self):"""点击转换为str按钮之后的处理方法读取文本框中的16进制内容,转换为str类型:return:"""# 获取文本框中的内容try: msg = self.ui.hex_input.toPlainText() result = binascii.a2b_hex(msg.replace(" ", "").lower()).decode() self.ui.hex_tran_result.setText(result)except: self.ui.hex_tran_result.setText('输入内容有误,请检查!!!')

3.协议生成和伪造包发送区块

- 按钮点击事件绑定

# 绑定发送一次按钮事件self.ui.once_send_btn.clicked.connect(self.on_once_send_btn_click)# 绑定循环开始按钮事件self.ui.loop_send_begin_btn.clicked.connect(self.on_loop_send_begin_btn_click)# 绑定循环结束按钮事件self.ui.loop_send_stop_btn.clicked.connect(self.on_loop_send_stop_btn_click)# 绑定生成协议按钮事件self.ui.creat_proto_btn.clicked.connect(self.on_creat_proto_btn_click)

- 实现点击事件方法

def on_creat_proto_btn_click(self): """ 点击生成协议按钮之后的处理方法 1.首先判断编号格式是否正确 2.判断参数格式是否正确 3.生成一个实例,然后调用对应的协议编号的encode方法,看是否正确返回 4.将生成的字节流转换成WPE字符串显示格式 :return: """ # 判断协议号和协议参数是否有内容 if self.ui.proto_id_line.text() and self.ui.proto_msg_line.toPlainText(): try: # 获取协议号 proto_id = int(self.ui.proto_id_line.text()) try: # 获取协议参数 args = eval(self.ui.proto_msg_line.toPlainText()) try: # 声明对应的协议类,并生成协议实例 exec("from proto_cfg.proto_%d import C%d" % (int(proto_id / 1000), proto_id)) obj = eval('C%d' % proto_id)(*args) # 调用obj序列化方法,获得字节流 proto, length, buf = obj.encode() # 将字节流拼接后按照wpe的格式显示到文本显示框 # 字节流转wpe的具体实现方法buf_to_wpe这里就不详细说明了 self.ui.textEdit.setText(buf_to_wpe(proto, length, buf)) except: out_put_to_log("协议生成失败:如确认填写正确,则可能是参数不符合协议格式,请检查对应的协议格式!") except: out_put_to_log("协议生成失败:协议参数不正确,请输入正确的参数") except: out_put_to_log("协议生成失败:协议编号格式不正确,请输入正确的数字") else: self.ui.textEdit.setText("协议号和协议内容不能为空!!!")def on_once_send_btn_click(self): """ 点击发送一次按钮之后的处理方法 读取文本框中的内容,转换为bytes,组合成一个完整协议,并发送给服务器 :return: """ # 首先从发送框得获取封包内容 try: data = str_to_buf(self.ui.textEdit.toPlainText()) # 判断agent状态是否正常 if self.agent_server.agent_obj.alive: # 判断封包内容是否符合正确格式,如果是,则发送,否则,提醒格式不正确 if check_data(data): self.agent_server.agent_obj.agent_insert_send(data) else: out_put_to_log("协议检查失败,填入的协议无法正常解析") else: self.ui.textEdit.setText("代理服务未启动,请先启动代理服务!") except: out_put_to_log("协议发送失败,填入的协议无法正常解析")def on_loop_send_begin_btn_click(self): """ 点击循环开始按钮之后的处理方法 读取文本框中的内容,转换为bytes,组合成完整的协议,循环发送给服务器 :return: """ # 首先从发送框得获取封包内容 data = str_to_byte(self.ui.textEdit.toPlainText()) # 判断agent状态是否正常 if self.agent_server.agent_obj.alive: # 检查一下封包内容是否符合正确格式,如果是,则发送,否则提醒格式不正确 if check_data(data): try: # 获取发送次数 times = int(self.ui.lineEdit.text()) if times == 0: # 设置一个打断开关 self.agent_server.agent_obj.loop_send = True try: # 获取发包间隔时间 sleep_time = int(self.ui.lineEdit_2.text()) # 设置一个最小间隔时间,防止输入错误 if sleep_time < 10: sleep_time = 10 # 调用agent_insert_send插包方法 Timer(0, self.agent_server.agent_obj.agent_insert_send, [data, times, sleep_time]).start() except: out_put_to_log("请检查间隔填写是否正确!") except: out_put_to_log("请检查次数填写是否正确!") else: out_put_to_log("协议检查失败,填入的协议无法正常解析") else: self.ui.textEdit.setText("代理服务未启动,请先启动代理服务!")def on_loop_send_stop_btn_click(self): """ 点击循环结束按钮之后的处理方法 停止之前进行的循环发协议 :return: """ self.agent_server.agent_obj.loop_send = False

4.常用方法区块

这里主要是自己写了几个比较常用的方法,然后跟按钮点击事件进行绑定,这里就不再详细讲了。

5.协议过程和日志的显示
这个主要是将文本信息 append 到 TextBrowser 控件中,这个很简单,这里也就不再讲了,可以自行百度。

三、使用

工具到这里就基本写完了,在使用的时候,我们需要先在客户端的配置文件里配置一个代理服务器,这个代理服务器的 ip 就是本地 ip127.0.0.1,端口设置为我们预留的一个端口,然后在工具那里配置一个服务器选项,ip 和端口为需要连接的服务器,在使用的时候,先选好工具的服务器,启动服务,然后打开游戏客户端,选择代理服务器(这样客户端在选择对应的服务器时才会与我们的代理创建 socket,而不是直连服务器),这样就可以通过工具中转,连接目标服务器了。

希望本文对你有所帮助~~如果对软件测试、接口测试、自动化测试、性能测试、面试经验交流感兴趣可以私聊我或关注公众号“特斯汀软件测试”。免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

5款游戏测试显示 Arc A750桌面版比RTX 3060更快

【锚思科技讯】据Ryan Shrout(Intel Graphics marketing)介绍,Intel高性能桌面独显Arc A750将在今年夏天晚些时候推出。

英特尔即将推出的基于ACM-G10处理器的Arc A750,在五个游戏测试中以2560×1440的分辨率提供比GeForce RTX 3060高出17%的性能。在Intel Graphics发布的视频中,该公司展示了新卡在选定游戏中的表现。这些游戏包括2021 F1、2077赛博朋克、Control、Borderlands和Fortnite。

Intel还分享了这款桌面显卡的渲染图,广告称为“限量版”,尽管我们仍然不知道这意味着什么。此外,尽管共享了卡的性能,但没有提供规格。

Arc A750预计具有24个Xe内核和12GB的GDDR6内存。英特尔已确认,该型号具有两个电源连接器(6pin和8pin),这表明其耗电超过225W。

我们还没有看到任何基于A750的定制设计,但正如几周前透露的那样,董事会合作伙伴已经在开发他们的设计。英特尔尚未确认其A750 GPU的发布日期或定价。

魔兽WLK:P2阶段五人本测试,213毕业装直接出,蓝装小号心态打崩

魔兽世界WLK怀旧服P2阶段已经开放测试了,玩家们只要拥有全球服和国际服的账号就能直接在PTR服务器建立角色。为了不浪费亲友在全球服给充的月卡,胖哥便在PTR服务器建立了一个角色打算一探究竟。

由于PTR服务器尚未开放奥杜尔的测试,所以目前只能测试五人本,下面胖哥就和大家分享一下P2阶段五人本的测试情况。

P2阶段英雄五人本增加了词缀特效,每个副本会对应不同的词缀。虽然P2阶段的五人本与正式服的大秘境玩法还是一定的区别,但是已经具备大秘境的雏形了,在特定词缀的加持下,个别副本的难度也变得非常高。比如

比如闪电大厅这个副本的词缀是“泰坦”,效果是NPC增加5%伤害和190%血量。每层涌动能量会额外增加1%的伤害,同时NPC受到的伤害也会增加2%,持续12秒。

泰坦词缀看着不起眼,毕竟只增加了5%的伤害,但是190%血量的加成却让闪电大厅成为了P2阶段最难五人本。

在泰坦词缀的加成下,小怪的血量已经接近20W了,尾王的血量更是高达150W左右。即便是P1阶段接近毕业的玩家去打H闪电大厅也有可能会灭团,更别提P2阶段的小号了。

目前参与测试的角色装备都比较差,模板装备的等级大概为190左右,武器还是178等级的任务蓝装,这也导致玩家的测试过程非常坎坷。遇到艾卓这种难度较低的副本还比较惬意,遇到岩石大厅和闪电大厅就非常尴尬了。

胖哥第一次去打闪电大厅的时候真的快把心态打崩了,在装备较差的情况下,甚至觉得比大秘境还难。

好在暴雪在提高五人本难度的同时,并没有吝啬BOSS掉落。P1阶段的五人本常规BOSS只掉落蓝装,尾王掉落的紫装也只有200等级。而P2阶段的掉落就非常优秀了。

P2阶段的五人本常规BOSS可以掉落200等级的紫色装备(P1阶段10人本掉落),尾王更是可以掉落213等级的装备(10人老克和双龙掉落),因此对于小号来说,P2阶段的成长速度还是非常快的。

不过从目前的难度来看,P2阶段的五人本设定还是非常尴尬的,理由有是能速刷的对装备没有需求,对装备有需求的则无法速刷。

除了五人本增加掉落之外,P2阶段的10人NAXX也会掉落25人NAXX的装备,如果暴雪不提升10人NAXX难度的话,那么190装等的小号完全去可以打10人NAXX,只要运气不是太差,获取装备的效率是远远高于五人本的。

另外,P2阶段英雄五人本掉落的牌子也从英雄变成了勇气,不过进入P2阶段之后,凯旋牌子和T8套装将会成为主流,届时勇气牌子也没有太大的价值了。

以上为个人观点,欢迎大家在评论区交流补充,记得关注胖哥哦!

2022年13个最佳软件测试工具

给qas们 推荐的软件测试工具

整个测试周期是软件测试中最重要的阶段之一。这些 QA 测试工具有助于完成这个过程:

1. Xray

Xray 的 Jira 集成使得实时跟踪您的工作变得容易。它的自动化特性可以帮助您在 bug 给客户造成问题之前找到它们。但是,它的手动工具使 qa 能够更好地控制测试的内容以及需要关注的项目的频率。

Xray 是质量保证的领先测试管理工具。它提供了一种管理自动和手动测试的有效方法。它还提供与流行的第三方的持续集成。

2. TestRail

TestRail 是一个全面的测试用例管理解决方案。它很容易使用。它是一个直观的基于 web 的界面,使得管理您的测试用例变得容易。

TestRail 还提供了一个灵活的、可扩展的解决方案,是您管理软件性能测试过程的最佳来源。

3. Testiny

Testiny 是一个新的、直接的测试管理工具。它非常适合中小规模的 QA 团队。它可以将手动和自动测试集成到应用程序开发过程中。它促进了开发人员和测试人员之间的协作。它还提供了一种简单的方法来跟踪和管理自动化测试用例。

此外,Testiny 具有管理和执行手动和自动化测试的健壮特性。

4. SpiraTest

SpiraTest 是一个强大的测试管理解决方案。它可以帮助团队优化他们的测试过程并获得高质量的结果。它的灵活方法符合您的需求、方法、工作流和工具链。因此,它使得开始测试变得更加容易,并从测试中获得最大收益。

使用 SpiraTest,您可以在一个环境中管理计划、测试、 bug、任务和代码。其最先进的特性简化了测试过程,并有助于确保质量结果。

Spriatest 可以帮助您将 web 应用程序测试提升到一个新的水平。

5. PractiTest

Practixtest 是一个端到端测试管理工具。它为您的测试过程提供了完全的可见性,并且对测试结果有了更深入的理解。它是所有 QA 利益相关者的公共会议场所; 因此,可以更好地进行协作和沟通。

Prusetest 还有许多特点,使其成为任何测试人员的必备工具。它可以创建和管理多个项目、测试套件和测试用例。它可以生成关于测试进度和结果的综合报告。

此外,practic 测试集成了许多流行的开发工具,这使它更容易在任何开发环境中使用。

Automation Testing Tools

这些测试自动化工具有助于您的应用程序在测试中的功能和回归测试。

6. Selenium

Selenium 是一个功能强大的测试自动化工具,它可以自动化基于浏览器的负载测试功能。

Selenium 是一个已经建立的软件测试工具。它带有特定语言的绑定来驱动浏览器。它还提供了很好的自动化特性,以便最大限度地方便快速地查找错误。

7. ACCELQ

软件开发的未来就在这里,它叫做 ACCELQ。跨行业垂直市场的客户正在利用这个革命性的人工智能平台。通过无缝的云集成,它可以显著地加快他们的自动化目标。

使用比传统方法快3倍的简单速度,您将能够更频繁地进行调整——同时在单元测试过程中节省资金。

Load Testing Tools

这些工具对于测试站点或应用程序的性能和加载时间至关重要。

8. LoadRunner

LoadRunner 工具是任何网站性能团队的重要组成部分。它可以帮助您测试 web 应用程序在重负载情况下的不良性能。它提供了有价值的洞察力,让我们知道当面对更高的流量水平时,它们的功能会有多好。

9. WebLOAD

WebLOAD 是一个强大的负载测试工具。它提供了许多脚本功能来帮助测试复杂的场景。该软件支持数百种技术,包括 Selenium移动应用程序。还可以使用这个平台在本地或云中生成负载。

Security Testing Tools

这些工具可以在你的应用程序中发现安全漏洞,这样,你就可以在黑客之前修复它们。

10. Acunetix Web Vulnerability Scanner

是查找安全漏洞的最有效的工具漏洞扫描器。它显示的假阳性数量最少。它还可以帮助您保证系统安全,防止有效的黑客攻击。

11. NetSparker

NetSparker 是一个自动化的安全测试软件。它检查网站、 web 应用程序和服务是否存在漏洞。它是唯一一个用概念验证代码来识别和验证这些缺陷的扫描器。

Cross-browser Testing Tools

跨浏览器测试工具

有了这些工具,你可以在不同的浏览器中测试你的网站,比如 Chrome 或者 Firefox。

12. Browsershots

Browsershots 是网站开发者的终极跨平台工具,它提供跨200多个浏览器的网站截图。

Browsershots 可以帮助您找到所有主要的东西 HTML/CSS 错误,以免它们成为用户的问题。因此,节省时间和金钱来修复它们,以后可能会更糟糕。

13. Browsera

是在不同浏览器中测试你的网站的完美工具。你可以使用这个程序来检查你是否在任何网页或网站元素上出错,比如测试脚本和布局。它会让你知道什么需要修复。这样,当用户访问你的页面时,你就没有意外后果了。

您应该使用哪些测试管理工具?

随着我们进入2022年及以后,看到自动化软件测试工具的前景如何变化将是非常有趣的。新技术不断涌现。因此,测试人员需要保持在曲线的前端,了解最新的工具和趋势。

虽然跟上最新和最好的软件测试工具可能很困难,但是您必须至少对最流行的软件测试工具有基本的了解。通过这种方式,您可以对哪些工具适合您的项目做出明智的决定。

幸运的是,我们与软件测试相关的站点 TestGuild 不断更新。所以,如果你想要保持你的技能敏锐并且了解最好的测试服务和工具,定期查看我们的目录。谁知道呢?也许你会发现一两个工具可以帮助你的测试游戏更上一层楼。



免责声明:本文由用户上传,如有侵权请联系删除!