docker、return 404 中的微服务 FastAPI 测试

Microservices FastAPI test in docker, return 404

我在微服务中创建了一个简单的库项目来学习和实现 FastAPI。 Docker 启动 5 个主要服务:

一切正常,向邮递员提出请求我没问题。

结构

问题描述

我添加了一个测试端点的测试目录。

(不完整的)作者测试示例

from starlette.testclient import TestClient
from app.main import app
from app.api.author import authors
import logging
log = logging.getLogger('__name__')
import requests

client = TestClient(app)

def test_get_authors():
    response = client.get("/")
    assert response.status_code == 200

def test_get_author():
    response = client.get("/1")
    assert response.status_code == 200

$> docker-compose exec author_service pytest . returns这个

============================================================================================================= test session starts =============================================================================================================
platform linux -- Python 3.8.3, pytest-5.3.2, py-1.9.0, pluggy-0.13.1
rootdir: /app
collected 2 items                                                                                                                                                                                                                             

tests/test_author.py FF                                                                                                                                                                                                                 [100%]

================================================================================================================== FAILURES ===================================================================================================================
______________________________________________________________________________________________________________ test_get_authors _______________________________________________________________________________________________________________

    def test_get_authors():
        response = client.get("/")
>       assert response.status_code == 200
E       assert 404 == 200
E        +  where 404 = <Response [404]>.status_code

tests/test_author.py:12: AssertionError
_______________________________________________________________________________________________________________ test_get_author _______________________________________________________________________________________________________________

    def test_get_author():
        response = client.get("/1")
>       assert response.status_code == 200
E       assert 404 == 200
E        +  where 404 = <Response [404]>.status_code

tests/test_author.py:16: AssertionError
============================================================================================================== 2 failed in 0.35s ==============================================================================================================

我尝试直接从容器中启动测试 shell 但完全不同。 只有按照文档(使用 starlette / fastapi)和 requests

完成的测试才会出现此问题

您可以在这里找到完整的项目 Library Microsrevices example

环境

docker-编写文件

version: '3.7'

services:
  book_service:
    build: ./book-service
    command: uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
    volumes:
      - ./book-service/:/app/
    ports:
      - 8001:8000
    environment:
      - DATABASE_URI=postgresql://book_db_username:book_db_password@book_db/book_db_dev
      - AUTHOR_SERVICE_HOST_URL=http://author_service:8000/api/v1/authors/
    depends_on:
      - book_db

  book_db:
    image: postgres:12.1-alpine
    volumes:
      - postgres_data_book:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=book_db_username
      - POSTGRES_PASSWORD=book_db_password
      - POSTGRES_DB=book_db_dev
  
  author_service:
    build: ./author-service
    command: uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
    volumes:
      - ./author-service/:/app/
    ports:
      - 8002:8000
    environment:
      - DATABASE_URI=postgresql://author_db_username:author_db_password@author_db/author_db_dev
    depends_on:
      - author_db

  author_db:
    image: postgres:12.1-alpine
    volumes:
      - postgres_data_author:/var/lib/postgres/data
    environment:
      - POSTGRES_USER=author_db_username
      - POSTGRES_PASSWORD=author_db_password
      - POSTGRES_DB=author_db_dev

  nginx:
    image: nginx:latest
    ports:
      - "8080:8080"
    volumes:
      - ./nginx_config.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - author_service
      - book_service

volumes:
  postgres_data_book:
  postgres_data_author:

这里的主要问题是您在测试文件上的端点

已修复测试示例:

from starlette.testclient import TestClient
from app.main import app
from app.api.author import authors
import logging
log = logging.getLogger('__name__')
import requests

client = TestClient(app)

def test_get_authors():
    response = client.get("/authors") # this must be your API endpoint to test
    assert response.status_code == 200

def test_get_author():
    response = client.get("/authors/1") # this must be your API endpoint to test 
    assert response.status_code == 200

已修复使用 docker0 网络 ip 地址和请求。现在可以在端口 8080

上使用 172.13.0.1 开始测试