1.准备至少两台服务器,集群全部是局域网,(启动脚本的时候可以使用外网ip)。

2.输出的报告地址,需要把文件夹设置成共享文件夹,(连接的时候使用内外ip)。

启动脚本文件

import os, datetime, sys# sys包启动py文件的时候可以给文件入参运行
HOST1 = "服务器1"
HOST2 = "服务器2"
MASTER_HOST = r"\\127.0.0.1"#主服务器,需要换成内外ip,不建议使用127.0.0.1
MASTER_HOST_report_PATH=fr"{MASTER_HOST}\output\report"
date = datetime.datetime.now().strftime("%Y_%m_%d")
dates = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
BASE_PATH = os.path.dirname(__file__)
filename = dates
param = sys.argv[1]
if param == "polis" or param == "loudliveroom" or param == "fittingroom":
os.mkdir(fr"{MASTER_HOST_report_PATH}\{param}\{filename}")
os.system(
fr'pytest -sv -d --tx socket={HOST1} --rsyncdir {BASE_PATH}\casetests -m "polis" --alluredir={MASTER_HOST_report_PATH}\{param}\{filename}\allure')#输出的报告路径需要主服务器地址加共享的文件夹路径(否则报告不会收集起来)
os.system(
fr"allure generate {MASTER_HOST_report_PATH}\{param}\{filename}\allure -o {MASTER_HOST_report_PATH}\{param}\{filename}\report --clean") elif param == "loudliveroom,fitting" or param == "loudliveroom,polis" or param == "fittingroom,polis" or param == "loudliveroom,fittingroom,polis":
os.mkdir(fr"{MASTER_HOST_report_PATH}\all_report\{filename}")
os.system(
fr'pytest -sv -d --tx socket={HOST1} --rsyncdir {BASE_PATH}\casetests -m "polis" --alluredir={MASTER_HOST_report_PATH}\all_report\{filename}\allure')
os.system(
fr"allure generate {MASTER_HOST_report_PATH}\all_report\{filename}\allure -o {MASTER_HOST_report_PATH}\all_report\{filename}\report --clean")
else:
print("脚本启动错误")

3.最重要文件:需要用sockserver.py在各个服务器先执行包括主服务器和子服务器。文件放在项目根目录下。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
"""
start socket based minimal readline exec server it can exeuted in 2 modes of operation 1. as normal script, that listens for new connections 2. via existing_gateway.remote_exec (as imported module) """
# this part of the program only executes on the server side
#
import os
import sys progname = "socket_readline_exec_server-1.2" def get_fcntl():
try:
import fcntl
except ImportError:
fcntl = None
return fcntl fcntl = get_fcntl() debug = 0 if debug: # and not os.isatty(sys.stdin.fileno())
f = open("/tmp/execnet-socket-pyout.log", "w")
old = sys.stdout, sys.stderr
sys.stdout = sys.stderr = f def print_(*args):
print(" ".join(str(arg) for arg in args)) if sys.version_info > (3, 0):
exec(
"""def exec_(source, locs):
exec(source, locs)"""
)
else:
exec(
"""def exec_(source, locs):
exec source in locs"""
) def exec_from_one_connection(serversock):
print_(progname, "Entering Accept loop", serversock.getsockname())
clientsock, address = serversock.accept()
print_(progname, "got new connection from %s %s" % address)
clientfile = clientsock.makefile("rb")
print_("reading line")
# rstrip so that we can use \r\n for telnet testing
source = clientfile.readline().rstrip()
clientfile.close()
g = {"clientsock": clientsock, "address": address, "execmodel": execmodel}
source = eval(source)
if source:
co = compile(source + "\n", "<socket server>", "exec")
print_(progname, "compiled source, executing")
try:
exec_(co, g) # noqa
finally:
print_(progname, "finished executing code")
# background thread might hold a reference to this (!?)
# clientsock.close() def bind_and_listen(hostport, execmodel):
socket = execmodel.socket
if isinstance(hostport, str):
host, port = hostport.split(":")
hostport = (host, int(port))
serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# set close-on-exec
if hasattr(fcntl, "FD_CLOEXEC"):
old = fcntl.fcntl(serversock.fileno(), fcntl.F_GETFD)
fcntl.fcntl(serversock.fileno(), fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
# allow the address to be re-used in a reasonable amount of time
if os.name == "posix" and sys.platform != "cygwin":
serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serversock.bind(hostport)
serversock.listen(5)
return serversock def startserver(serversock, loop=False):
execute_path = os.getcwd()
try:
while 1:
try:
exec_from_one_connection(serversock)
except (KeyboardInterrupt, SystemExit):
raise
except:
if debug:
import traceback traceback.print_exc()
else:
excinfo = sys.exc_info()
print_("got exception", excinfo[1])
os.chdir(execute_path)
if not loop:
break
finally:
print_("leaving socketserver execloop")
serversock.shutdown(2) if __name__ == "__main__":
import sys if len(sys.argv) > 1:
hostport = sys.argv[1]
else:
hostport = ":8888"
from execnet.gateway_base import get_execmodel execmodel = get_execmodel("thread")
serversock = bind_and_listen(hostport, execmodel)
startserver(serversock, loop=True) elif __name__ == "__channelexec__":
chan = globals()["channel"]
execmodel = chan.gateway.execmodel
bindname = chan.receive()
sock = bind_and_listen(bindname, execmodel)
port = sock.getsockname()
chan.send(port)
startserver(sock)

4.如果项目需要截图和用到图片识别的时候,记得把图片读取路径和存放路径放在(pyexecnetcache)文件路径下。

win系统airtest+pytest-xdist服务器分布式运行。的更多相关文章

  1. 在Linux(Centos7)系统上对进行Hadoop分布式配置以及运行Hadoop伪分布式实例

    在Linux(Centos7)系统上对进行Hadoop分布式配置以及运行Hadoop伪分布式实例                                                     ...

  2. 电脑开机后win系统运行异常慢,鼠标移动卡

    今天公司里面一个小伙伴的电脑开机后还没有打开应用程序系统就运行非常慢,打开文件夹反应慢,鼠标是一点一点的在移动.体验感极差.作为运维的我立即上去解决问题: 首先是查看一下电脑确实运行比较慢,然后就查看 ...

  3. 服务器CGI运行机制

    CGI概括: 定义 通用网关接口(Common Gateway Interface)是HTTP服务器与你的或其它机器上的程序进行"交谈"的一种工具,其程序须运行在网络服务器上. 功 ...

  4. Visual Studio写的项目在 IIS 服务器上运行的两种简单方法

    首先需要PC上开启了IIS服务,相关方法网上很多,也很简单 第一种:直接在项目中操作 1.创建一个项目,然后右击选中项目,右击,单击属性,打开项目属性标签页面 如图,选择Web标签,在服务器栏目中选中 ...

  5. Jmeter之Linux安装(Xshell),分布式运行Linux作为slave机

    甲方爸爸要求,用Linux压测......   所以在公司服务器Linux上搭建Jmeter 但实际一个Jmeter程序也有程序瓶颈~ 所以在Jmeter瓶颈下,搭建分布式压测系统.(也许可以尝试在一 ...

  6. java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 Hadoop完全分布式运行模式 步骤分析: 编写集群分发脚本xsync 集群配置 集群部署规划 配置集群 集群单 ...

  7. 业务可视化-让你的流程图"Run"起来(3.分支选择&跨语言分布式运行节点)

    前言 首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(2.问题与改进)]的支持. 分享一下近期我对这个项目的一些改进. 1. 增加了分支选择工程,可以根据节点的 ...

  8. centos中-hadoop单机安装及伪分布式运行实例

    创建用户并加入授权 1,创建hadoop用户 sudo useradd -m hadoop -s /bin/bash 2,修改sudo的配置文件,位于/etc/sudoers,需要root权限才可以读 ...

  9. 架构设计:系统存储(28)——分布式文件系统Ceph(挂载)

    (接上文<架构设计:系统存储(27)--分布式文件系统Ceph(安装)>) 3. 连接到Ceph系统 3-1. 连接客户端 完毕Ceph文件系统的创建过程后.就能够让客户端连接过去. Ce ...

  10. Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825

    Atitit.播放系统的选片服务器,包厢记时系统 的说明,教程,维护,故障排查手册p825 1. 播放系统服务器方面的维护2 1.1. 默认情况下,已经在系统的启动目录下增加了俩个启动项目2 1.2. ...

随机推荐

  1. 结构性模式 - 适配器模式Adapter

    学习而来,代码是自己敲的.也有些自己的理解在里边,有问题希望大家指出. 模式的定义与特点 适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不 ...

  2. Quartz.Net源码Example之Quartz.Examples.AspNetCore

    Quartz.Examples.AspNetCore ​ .NetCore的Web系统,后台主要执行多个触发器任务,前台展示所有触发器信息和正在执行的作业的相关信息,还可以通过访问health-UI来 ...

  3. MRS_下载相关问题汇总

    解决问题如下: MRS下载编译时,更改生成文件是HEX文件还是BIN文件 关于MounRiver下载时如何选择配置部分擦除 关于MounRiver下载起始地址配置问题 MRS下载编译时,更改生成文件是 ...

  4. 12月20日内容总结——ajax补充知识点、多对多外键的三种创建方式、django内置序列化组件、批量操作数据、分页器推导思路与自定义分页器的使用、form组件

    目录 一.ajax补充说明 二.多对多三种创建方式 三.django内置序列化组件(drf前身) 四.批量操作数据 五.分页器思路 六.自定义分页器的使用 七.form组件 forms组件介绍 For ...

  5. 9月21日内容总结——计算机基础知识、typora软件的安装与软件内的部分markdown语法

    今日内容总结 目录 今日内容总结 一.路径 1.绝对路径 2.相对路径 二.计算机的本质 三.计算机的五大组成部分 1.控制器 2.运算器 PS:CPU=控制器+运算器 3.存储设备 4.输入设备 5 ...

  6. mysql 错误解决大法 Specified key was too long; max key length is 767 bytes

    高版本mysql向低版本(5.7以下)导入sql时可能会发生此问题 开启索引最大长度 SET GLOBAL INNODB_LARGE_PREFIX = ON; 将表改为动态表SET GLOBAL in ...

  7. Swagger2多包扫描

    package com.xf.config; import org.springframework.context.annotation.Bean; import org.springframewor ...

  8. 逻辑运算符、成员运算符、身份运算符、流程控制、if判断、while循环

    目录 一.逻辑运算符 二.成员运算符 三.身份运算符 四.流程控制 五.分支结构 (1).单if判断 (2).双分支结构 (3).多分支结构 (4).if的嵌套使用 六.循环结构while (1).w ...

  9. 爬取精美壁纸5w张,爱了爱了

    近日接到一个需求--爬取某应用商店所有在线销售壁纸,这个任务起初让我惊呆了.因为上级没有给我解决风控问题,若爬取在售资源被人家厂商追责怎么办?若造成人家服务器出问题怎么办?问的时候上级含糊其辞,唉!其 ...

  10. GoAccess实现请求监

    GoAccess实现请求监控 简介 GoAccess是一款开源的实时web日志分析器和交互式查看器,用于可视化查看HTTP统计信息,可以系统的终端上运行,也可以通过浏览器运行: 本文通过使用GoAcc ...