#jest #unit #test #test-cases

testcat

编写可读性更高的测试宏

10个版本 (稳定版)

2.1.0 2024年1月14日
2.0.1 2022年2月15日
1.1.2 2022年1月20日
0.2.0 2022年1月14日
0.1.1 2022年1月14日

#633测试

Download history 1/week @ 2024-03-11 38/week @ 2024-04-01

每月62次 下载
mutils 中使用

MIT 协议

310KB
422

TestCat

TestCat是一组宏,使您能够以更可读的方式维护测试。通过允许将测试用例在文件顶部组合在一起。

它基于JavaScript测试库Jest。

宏包括...

  • ittest
  • describe

目标

目标是提高可读性。使管理包含大量测试的长文件变得更简单。

通过将测试用例分组在一起。它可以让您一眼看出有哪些测试用例。这对于代码审查特别有用。

完整示例

简而言之,它允许您像这样记录测试用例...

#[cfg(test)]
mod angle_to {
    use super::*;
    use ::testcat::*;
    use ::assert_approx_eq::assert_approx_eq;
    use ::std::f32::consts::TAU;

    describe!("angle to zero", {
        it!("should angle to zero from right", test_angle_to_zero_from_right);
        it!("should angle to zero from above", test_angle_to_zero_from_above);
        it!("should angle to zero from left", test_angle_to_zero_from_left);
        it!("should angle to zero from below", test_angle_to_zero_from_below);
    });

    describe!("angle to point", {
        it!("should angle to point from right", test_angle_to_point_from_right);
        it!("should angle to point from above", test_angle_to_point_from_above);
        it!("should angle to point from left", test_angle_to_point_from_left);
        it!("should angle to point from below", test_angle_to_point_from_below);
    });

    fn test_angle_to_zero_from_right() {
      // code omitted
    }

    // rest of test functions omitted

运行 cargo test,您将得到以下输出...

Example cargo test output

ittest

ittest 是相同的宏,允许您在顶部一起列出测试用例。这些宏转换为一个包装函数,该函数调用您的测试。宏接受测试的描述和该测试的函数名称。

有两种版本可帮助提高可读性。它们的行为相同。

  • 当说明期望的结果时应该使用 it。例如,it!("should give the user a cookie", test_give_cookie)
  • 对于其他类型的更通用的测试应该使用 test。例如,test!("cookie dispenser runs", test_cookie_dispenser)

示例代码

#[cfg(test)]
mod testing {
  use ::testcat::*;

  it!("should allow the user to do x", test_user_does_x);
  it!("should not allow the user to do y", test_y_disallowed);
  test!("foobobulator doesn't crash", test_foobobulator);

  fn test_user_does_x() {
    // code omitted
  }

  fn test_y_disallowed() {
    // code omitted
  }

  fn test_foobobulator() {
    // code omitted
  }
}

模块名称

您还可以使用模块路径作为测试名称。

#[cfg(test)]
mod testing {
  use ::testcat::*;

  it!("should allow the user to do x", test_use::test_does_x);
  it!("should not allow the user to do y", test_use::test_y_disallowed);
  test!("foobobulator doesn't crash", test_foo::test_foobobulator);

  mod test_use {
    pub fn test_does_x() {
      // code omitted
    }

    pub fn test_y_disallowed() {
      // code omitted
    }
  }

  mod test_foo {
    pub fn test_foobobulator() {
      // code omitted
    }
  }
}

describe

describe 块用于将相似的测试分组在一起。这些块将转换为一个子模块,其中列出测试。

示例代码

#[cfg(test)]
mod testing {
  use ::testcat::*;

  describe("user interaction", {
    it!("should allow the user to do x", test_user_does_x);
    it!("should not allow the user to do y", test_y_disallowed);
  })

  describe("timing", {
    it!("should do foo before bar", test_foo_over_bar);
  })

  fn test_user_does_x() {
    // code omitted
  }

  fn test_y_disallowed() {
    // code omitted
  }

  fn test_foo_over_bar() {
    // code omitted
  }
}

示例 2

describe 块也可以包含函数。因为这是一个子模块的代码。

#[cfg(test)]
mod testing {
  use ::testcat::*;

  describe("user interaction", {
    it!("should allow the user to do x", test_user_does_x);
    it!("should not allow the user to do y", test_y_disallowed);

    fn test_user_does_x() {
      // code omitted
    }

    fn test_y_disallowed() {
      // code omitted
    }
  })

  describe("timing", {
    it!("should do foo before bar", test_foo_over_bar);

    fn test_foo_over_bar() {
      // code omitted
    }
  })
}

依赖项