YAPI——api自动化测试平台

 memo
 

简介

YAPI是一个很炫酷的企业级api自动化测试平台,最早是由去哪儿开发,后来移交给百度进行维护。

记录几个玩docker-yapi时踩的坑

在windows7中安装docker-yapi体验学习一下如何使用YAPI,在此过程中遇到如下几个问题:

  • Error: getaddrinfo ENOTFOUND yapi.demo.qunar.com

    此错误可忽略,貌似在配置文件中重定向到了https://registry.npm.taobao.org

  • 镜像build了好多次, 模块找不到

    internal/modules/cjs/loader.js:818
    throw err;
    ^

    Error: Cannot find module ‘/my-yapi/vendors/server/app.js’
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)
    at Function.Module._load (internal/modules/cjs/loader.js:667:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47 {
    code: ‘MODULE_NOT_FOUND’,
    requireStack: []
    }

    第一次修改docker-compose.yml里的command指令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    yapi:
    build:
    context: ./
    dockerfile: Dockerfile
    image: yapi
    # 第一次启动使用
    # command: "yapi server"
    # 之后使用下面的命令
    command: "node /my-yapi/vendors/server/app.js"

    修改成

    1
    2
    3
    4
    5
    6
    7
    8
    9
    yapi:
    build:
    context: ./
    dockerfile: Dockerfile
    image: yapi
    # 第一次启动使用
    command: "yapi server"
    # 之后使用下面的命令
    # command: "node /my-yapi/vendors/server/app.js"
  • Operation not permitted.

    此错误在web配置页面中显示为:

    Error: 连接数据库失败 Error: getaddrinfo ENOTFOUND mongo at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26) { name: ‘MongoError’ }]

    Error: 连接数据库失败, failed to connect to server [mongo:27017]

    查询一下docker中与mongo相关的环境(此处镜像为mongo:4,docker-yapi起的容器名为docker-yapi_mongo_1):

    1
    2
    docker ps
    docker ps -a

    发现docker-yapi的mongo环境没有启动成功。

    这是因为Windows和OS X上的默认Docker设置使用VirtualBox VM来托管Docker守护程序。不幸的是,VirtualBox用于在主机系统和Docker容器之间共享文件夹的机制与MongoDB使用的内存映射文件不兼容(请参阅vbox bug,docs.mongodb.org和相关的jira.mongodb.org错误)。这意味着无法运行映射到主机的数据目录的MongoDB容器。原文见Docker Hub中mongoDB官方镜像对此的描述:

    WARNING (Windows & OS X): The default Docker setup on Windows and OS X uses a VirtualBox VM to host the Docker daemon. Unfortunately, the mechanism VirtualBox uses to share folders between the host system and the Docker container is not compatible with the memory mapped files used by MongoDB (see vbox bug, docs.mongodb.org and related jira.mongodb.org bug). This means that it is not possible to run a MongoDB container with the data directory mapped to the host.

    解决方案是创建docker数据卷(Volume)作为保存持久化数据的目录,数据卷Volume可理解为虚拟磁盘。

    1
    2
    3
    4
    5
    # 创建Volume虚拟磁盘
    docker volume create --name <名称>

    # 删除Volume虚拟磁盘
    docker volume rm <名称>

    例如此处可以创建名为mongodata的数据卷,并与docker-yapi中配置的mongo数据目录建立映射:

    1
    2
    docker volume create --name mongodata
    docker run --name mongodb -v mongodata:/data/db -p 27017:27017 -d mongo:latest
  • “msg”:”Authentication failed”,”attr”:{“mechanism”:”SCRAM-SHA-1”,”speculative”:false,”principalName”:”yapi”,”authenticationDatabase”:”yapi”,”error”:”UserNotFound: Could not find user \”yapi\” for db \”yapi\””}

    此错误在web配置页面中显示为:

    Error: 连接数据库失败, Authentication failed.

    这是因为新版本的MongoDB权限管理更加严格,可手动登入docker中的mongo环境配置用户yapi的权限(根据docker-yapi自带的配置文件进行配置即可)