# FastAPI 在使用 pytest 加载不同的配置文件，以实现测试环境单独运行某些配置项目

- Link: https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/
- Published: 2023-11-26T21:30:00+08:00
- Author: 白宦成

文章目录

 [Toggle](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#)

 * [引言](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e5%bc%95%e8%a8%80)
 * [内容大纲](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e5%86%85%e5%ae%b9%e5%a4%a7%e7%ba%b2)
 * [模块详细内容](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e6%a8%a1%e5%9d%97%e8%af%a6%e7%bb%86%e5%86%85%e5%ae%b9)
    - [实现读取 .env 文件](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e5%ae%9e%e7%8e%b0%e8%af%bb%e5%8f%96_env_%e6%96%87%e4%bb%b6)
    - [实现在测试环境读取 .env.testing 文件](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e5%ae%9e%e7%8e%b0%e5%9c%a8%e6%b5%8b%e8%af%95%e7%8e%af%e5%a2%83%e8%af%bb%e5%8f%96_envtesting_%e6%96%87%e4%bb%b6)
 * [结论](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e7%bb%93%e8%ae%ba)
 * [附加部分](https://www.ixiqin.com/2023/11/26/fastapi-loads-different-configuration-files-using-pytest-to/#%e9%99%84%e5%8a%a0%e9%83%a8%e5%88%86)

## 引言

Fast API 作为一个新兴的 Python Web 框架，不少的开发者都在使用 FastAPI 来开发应用。
我最近也在试着使用它。

在开发应用时，我习惯使用 TDD 的方式进行开发，特别是开发飞书机器人时，由于飞书给我
提供的请求是可预测的，特别适合以 TDD 的方式来定义行为并实现。

同时，我在使用其他语言开发的时候，也会用到使用 `.env` 和 `.env.testing` 这样的配置
文件来在不同的环境下加载不同的配置文件，达到在不同环境使用不同的变量来完成任务。

## 内容大纲

 1. **实现读取 .env 文件**
 2. **实现在测试环境读取 `.env.testing` 文件**

## 模块详细内容

### 实现读取 .env 文件

想要实现在 FastAPI 中读取 `.env` 文件，首先，你需要引入 pydantic_settings 包，来
完成基本的配置文件的读取。

    ```shcb-line-numbers
    from pydantic_settings import BaseSettings

    class Settings(BaseSettings):
        app_name: str = "Awesome API"

    settings = Settings()
    print(settings.app_name)
    ```

接下来你可以为这个 Settings 类新增 Config 配置，以实现读取本地的 `.env` 文件

    ```shcb-line-numbers
    from pydantic_settings import BaseSettings

    class Settings(BaseSettings):
        app_name: str = "Awesome API"

        class Config:
            env_file = ".env"

    settings = Settings()
    print(settings.app_name)
    ```

通过上述代码，你的配置项目就会自动读取 `.env` 文件来加载环境变量，从而实现更加简单
的环境变量管理。

### **实现在测试环境读取 `.env.testing` 文件**

在测试时，为了避免使用线上的数据，你可以在测试时加载不同的环境变量文件。

如果你只有一个测试环境，可以有一个非常简单的方式来实现：在配置 env file 时，传入
一个元组，会自动加载多个文件。

    ```shcb-line-numbers
    from pydantic_settings import BaseSettings

    class Settings(BaseSettings):
        app_name: str = "Awesome API"

        class Config:
            env_file = (".env",".env.testing")

    settings = Settings()
    print(settings.app_name)
    ```

需要注意，这里实现的实际上是使用 pydantic-settings 自己的加载顺序来实现。默认情况
下，靠后的文件优先级会更高（覆盖了前面的内容）。这样的好处是如果你有些配置测试环
生产是一样的，可以在 `.env.testing` 中加入不同的部分，相同的部分直接复用生产环境
的配置项目即可。

但由于使用的是顺序加载多个问题，如果你发现表现和你配置的不一致时，就要看看是不是
有优先级更高的环境变量文件覆盖了默认的 `.env` 文件。

## 结论

借助 pydantic-settings 的一些配置，你可以快速实现 `.env` 和 `.env.testing` 的加载，
相比与判断环境变量，这样会比较简单，且可以实现在 `.env.testing` 中只维护变量，和
线上保持一致的部分可以直接继承。

---

## 附加部分

 * 参考链接：[https://fastapi.tiangolo.com/zh/advanced/settings/](https://fastapi.tiangolo.com/zh/advanced/settings/)
