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

冷月醉夕阳 · 2019年08月11日 · 最后由 Jan95 回复于 2022年12月11日 · 2303 次阅读

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

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

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

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

共收到 19 条回复 时间 点赞

前两天刚好看了个这方面的帖子
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 来请求的,好像暂时也没什么问题,后面再观察下

通过 parser.addoption 设置环境后,我发现我数据驱动根本不能运行,获取数据的时候判断不了 pytest 钩子函数对象

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册