#db #mysql #sqlx #test-data #testing

testfixtures

一个用于从yaml文件中准备测试数据的Rust库

3个版本

0.1.2 2020年6月28日
0.1.1 2020年6月27日
0.1.0 2020年6月27日

#2683 in 数据库接口

MIT 协议

54KB
1K SLoC

testfixtures

build crates docs license downloads

testfixtures是一个Rust库,用于从yaml文件中准备测试数据。

安装

此crate与async-std和tokio运行时兼容。

async-std

[dependencies]
testfixtures = "0.1"
sqlx = "0.3"
chrono = "0.4.11"

tokio

[dependencies]
testfixtures = { version = "0.1", default-features = false, features = [ "runtime-tokio" ] }
sqlx = { version = "0.3", default-features = false, features = [ "runtime-tokio", "macros" ] }
chrono = "0.4.11"

使用

创建如下所示的固定文件。

todos.yml

- id: 1
  description: buy a new camera
  done: true
  progress: 10.5
  created_at: 2020/01/01 01:01:01
- id: 2
  description: meeting
  done: false
  progress: 30.0
  created_at: 2020/01/01 02:02:02
点击查看日期时间格式示例
2020-01-01 01:01
2020-01-01 01:01:01
20200101 01:01
20200101 01:01:01
01012020 01:01
01012020 01:01:01
2020/01/01 01:01
2020/01/01 01:01:01

如果您需要编写原始SQL,可能用于调用函数,请将列的值前缀为RAW=。

- id: 1
  description: fizz
  done: true
  progress: 10.5
  created_at: RAW=NOW()

您的测试将如下所示。


#[cfg(test)]
mod tests {
    use chrono::Utc;
    use sqlx::MySqlPool;
    use std::env;
    use testfixtures::MySqlLoader;

    #[async_std::test]
    async fn test_something() -> anyhow::Result<()> {
        let pool = MySqlPool::new(&env::var("DATABASE_URL")?).await?;
        let loader = MySqlLoader::new(|cfg| {
            cfg.location(Utc);
            cfg.database(pool);
            cfg.skip_test_database_check();
            cfg.paths(vec!["fixtures/todos.yml"]);
        })
        .await?;

        // load your fixtures
        loader.load().await.unwrap();

        // run your tests

        Ok(())
    }
}

PgLoaderSqliteLoader 正在开发中。

选项

database(必需)

database是传递db连接池到Loader的选项。

let pool = MySqlPool::new(&env::var("DATABASE_URL")?).await?;
let loader = MySqlLoader::new(|cfg| {
    cfg.database(pool);
    // ...
})
.await?;

location(必需)

location是设置时区的选项。

use chrono::Utc;

let loader = MySqlLoader::new(|cfg| {
    cfg.location(Utc);
    // or cfg.location(Local);
    // ...
})
.await?;

skip_test_database_check(可选)

skip_test_database_check是设置检查数据库名是否以"test"结尾的标志的选项。

let loader = MySqlLoader::new(|cfg| {
    cfg.skip_test_database_check();
    // ...
})
.await?;

files(可选)

files是读取您的固定文件的选项。

let loader = MySqlLoader::new(|cfg| {
    cfg.files(vec!["fizz.yml"]);
    // ...
})
.await?;

directory(可选)

files是在目录中读取您的固定文件的选项。

let loader = MySqlLoader::new(|cfg| {
    cfg.directory("fixture");
    // ...
})
.await?;

paths(可选)

paths是files选项和directory选项的组合。

let loader = MySqlLoader::new(|cfg| {
    cfg.paths(vec!["fizz", "buzz/todos.yml"]);
    // ...
})
.await?;

实现状态

数据库

  • MySQL和MariaDB
  • Postgres
  • SQLite

选项

  • database
  • 加载文件
  • skip_test_database_check
  • location
  • directory
  • paths
  • template

贡献

# setup test db
$ make db

# load environment variables
$ make env
$ direnv allow # https://github.com/direnv/direnv

# run unit tests
$ make test

参考

https://github.com/go-testfixtures/testfixtures

依赖关系

~14–32MB
~457K SLoC