接口测试 大家在做接口自动化时,怎么做到同一个服务器下同时运行多个环境的?

冷月醉夕阳 · August 11, 2019 · Last by 冷月醉夕阳 replied at August 16, 2019 · 2221 hits

例如: 有这么一个场景
A版本提测, 域名 banana.cc.com 1.1.1.1
B版本提测,域名 banana.cc.com 2.2.2.2

这样一来如果是在同一个服务器上面运行的话, 就要排队, 不能同时执行

我的想法是直接通过IP来访问(不考虑多服务器的情况下), 如果是通过域名切换host方式的话, 没办法做到同一个服务器上同时运行二个版本,必须要等跑完一个再执行一个

通过IP直接访问就是可能会一个问题,例如当前服务依赖其他服务的话不知道会不会出现什么问题?

共收到 18 条回复 时间 点赞

前两天刚好看了个这方面的帖子
https://www.cnblogs.com/toops/p/8228133.html

Ark 回复

这种做法我也试过, 目前是没发现有什么问题, 只是不清楚这种方式会带来什么影响?

既然是自动化,如果出现环境要排队的情况,总感觉有点浪费时间

不用排队啊,你启动测试的时候传一个环境的变量进去,然后根据这个变量切换对应的IP就可以了啊

直接脚本配置里配置被测应用以及其依赖应用的 ip ,会有什么困难?或者说你用的是哪个接口测试工具,分享下,大家说不定可以告诉你对应的方案?

用 host ,作用域都是整个服务器,所以会出问题。但如果是脚本里配置,那作用域就只有单次执行的进程,可以做到相互独立。

看不懂你的问题,到底是在一台机器上不能同时部署两套被测试的系统导致测试排队,还是测试代码不支持同时测在一台机器上的两套被测系统。

这有啥影响的? 难道是测试数据的问题?

陈恒捷 回复

您好, 工具采用的是python+requests库自己二次封装,你说到重点了,我目前能想到的就是利用requests的dns解释,例如:

def dns_resolve(env, domain):  # 域名解析函数,解析成功IP将追加到iplist
try:
hosts = {
"A": { # A环境
"banana.cc.com": '11.112.1.1'
} ,
"B":{ # B环境
"banana.cc.com": '12.11.10.28'
}
}
if domain in hosts:
return hosts[env][domain]
except Exception as e:
print("dns resolver error. %s" % e)
return

调用:
r = requests.request('post', 'https://' + dns_resolve("A", domain) + _url, data=body, headers=headers(), verify=False)

这样我就可以不需要配置host了,直接通过进程来隔离了,有时host可能有很多几十个, 不知道还有没有其他的更好的方法

hellohell 回复

蒽 ,你看我#7的回复,准确来说是代码没有做到环境隔离吧,直接用IP请求不用域名不知道会不会出问题

徐汪成 回复

其实我就是想知道,同一套代码,一台机器,怎么做到区分多个环境同时执行,目前我用的是切换host方式,那自然是A任务在运行时, B任务因为环境不同(B任务域名和A任务域名一样,但IP不一样)就要等A完了才能执行,目前想到的就是只能通过IP隔离

有个点不大理解,为何必须要绑定域名这个东西?是有什么特殊需要吗?

本来域名就是为了避免 ip 难记所以才弄的。如果既要有域名,又要有 ip ,何不直接用 ip ?

我们目前做法是,框架提供一个环境名称配置项,可以根据这个配置项的值调整,选用不同环境的配置文件,配置文件里再具体写这个环境里各个服务的地址信息。这样启动命令里面给不同的环境名称,就可以切换不同环境了。为了方便不改代码加配置,也支持通过环境变量或者直接写具体配置项名称,覆盖配置文件里面的值。

spring boot config 在这方面可以说是做到了极致,支持17种配置方式,甚至还支持配置的继承,推荐看下:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

陈恒捷 回复

我们有二个环境, 测试环境和灰度环境, 测试环境有几十个域名, 就好比私有化的那种部署,测试的时候大家都要配置所有域名测试, 那对应的接口肯定也是通过域名来请求的,所以就会存在这个问题,之前也有咨询过开发,开发建议不要用IP直接访问,我们没有固定的IP的,IP和域名会随时变的(部署到哪个服务器就哪个服务器)

可以问下开发为何不要用 ip 直接访问,是出于什么原因?

我们只有线上用域名,测试环境大多是 ip 。如果要配置域名,不同环境的域名一定是会区分的,要不会乱套,也非常容易连错(配置改得多,错误率自然也会上升,而且你本地的东西,谁都无法复现解决。。。)

我的做法是维护一个配置文件,在执行的Python文件入口通过传入一个标记位来获取统一的host参数,并且通过pytest来标记不同环境要执行的用例。
例如执行Python test.py 1, 这样就只会执行属于正式环境的用例,域名也指向正式环境

这是之前整理的,可以参考一下
https://testerhome.com/articles/17504

我无法理解你们为什么同一个域名下面会对应两个或者多个IP,就算集群部署,不应该有负载吗?统一入口不是负载IP吗?

其实我就是想知道,同一套代码,一台机器,怎么做到区分多个环境同时执行

这种肯定是用配置文件的方式去区分环境参数,怎么同时执行?代码内可以多线程,代码外可以同时启动多次嘛。

那自然是A任务在运行时, B任务因为环境不同(B任务域名和A任务域名一样,但IP不一样)就要等A完了才能执行

域名就是映射到IP或者CDN,你直接访问IP或者CDN不是一样的效果吗?

为什么用域名不用IP?
header里的Host不同

hosts文件应该是属于系统的文件。请问你是如果做到同一域名下不同hosts的切换? 如果有并发的两个接口都需要修改hosts如何做隔离?

shandongdong 回复

蒽 ,不能通过hosts方式, 只能通过配置文件或者标识来区分不同的IP,只能IP发起请求, 同时运行多个任务的话,相当于多个线程,这样是不会相互有影响的

徐汪成 回复

蒽 ,业务就是这样,目前是通过IP来请求的,好像暂时也没什么问题,后面再观察下

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up