如何在 Rust 中运行任何测试之前运行设置代码?

     2023-02-24     215

关键词:

【中文标题】如何在 Rust 中运行任何测试之前运行设置代码?【英文标题】:How to run setup code before any tests run in Rust? 【发布时间】:2019-09-19 07:39:04 【问题描述】:

我有一个 Rust 应用程序(一个简单的解释器),需要在环境可用之前进行一些设置(初始化一个 repo)。

我了解 Rust 以多线程方式运行其测试(通过 cargo test),因此我需要在任何测试运行之前初始化 repo。我还需要每次运行只执行一次,而不是在每次测试之前。

在 Java 的 JUnit 中,这将通过 @BeforeClass(或 JUnit 5 中的 @BeforeAll)方法来完成。我怎样才能在 Rust 中实现同样的目标?

【问题讨论】:

【参考方案1】:

没有任何内置功能可以做到这一点,但这应该会有所帮助(您需要在每次测试开始时调用initialize()):

use std::sync::Once;

static INIT: Once = Once::new();

pub fn initialize() 
    INIT.call_once(|| 
        // initialization code here
    );

【讨论】:

【参考方案2】:

如果您使用ctor crate,您可以利用在运行任何测试之前运行的全局构造函数。

这是一个初始化流行的env_logger crate 的示例(假设您已将ctor 添加到Cargo.toml 文件中的[dev-dependencies] 部分):

#[cfg(test)]
#[ctor::ctor]
fn init() 
    env_logger::init();

函数名不重要,你可以随便命名。

【讨论】:

我应该把这个放到每个.rs文件中吗?【参考方案3】:

为了给人们更多的想法(例如,如何不在每次测试中调用setup),您可以做的另一件事是编写这样的帮助程序:

fn run_test<T>(test: T) -> ()
    where T: FnOnce() -> () + panic::UnwindSafe

    setup();    
    let result = panic::catch_unwind(|| 
        test()
    );    
    teardown();    
    assert!(result.is_ok())

然后,在您自己的测试中,您可以这样使用它:

#[test]
fn test() 
    run_test(|| 
        let ret_value = function_under_test();
        assert!(ret_value);
    )

您可以在此处阅读有关UnwindSafe trait 和catch_unwind 的更多信息:https://doc.rust-lang.org/std/panic/fn.catch_unwind.html

我在 Eric Opines 的 this medium article 中找到了这个测试助手的最初想法。

此外,rstest crate 具有 pytest-like 固定装置,您可以将其用作设置代码(与 Jussi Kukkonen's answer 结合使用:

use std::sync::Once; 
use rstest::rstest;
static INIT: Once = Once::new();

pub fn setup() -> ()  
    INIT.call_once(|| 
        // initialization code here
    );


#[rstest]
fn should_success(setup: ()) 
    // do your test

也许有一天 rstest 将获得范围支持,并且不再需要 Once

【讨论】:

如何在 Python 中的每个单元测试之前和之后运行特定代码

】如何在Python中的每个单元测试之前和之后运行特定代码【英文标题】:Howtoarunspecificcodebefore&aftereachunittestinPython【发布时间】:2015-06-0501:21:45【问题描述】:以下是我在文件中的测试结构。类设置测试01测试02测试03拆解我需... 查看详情

如何在测试失败后但在任何 @After 方法之前让 JUnit 4.8 运行代码?

】如何在测试失败后但在任何@After方法之前让JUnit4.8运行代码?【英文标题】:HowcanImakeJUnit4.8runcodeafterafailedtest,butbeforeany@Aftermethods?【发布时间】:2012-01-2318:01:25【问题描述】:我正在使用JUnit4.8.2进行一套Selenium测试(实际上是W... 查看详情

XCode OCUnit 在运行任何测试代码之前崩溃并出现 Abort 陷阱:6

】XCodeOCUnit在运行任何测试代码之前崩溃并出现Abort陷阱:6【英文标题】:XCodeOCUnitcrasheswithAborttrap:6beforeanytestcodeisrun【发布时间】:2012-09-2604:20:26【问题描述】:我有以下愚蠢的简单测试用例(在带有对应.h文件的.mm文件中定义... 查看详情

在 JUnit 5 中,如何在所有测试之前运行代码

】在JUnit5中,如何在所有测试之前运行代码【英文标题】:InJUnit5,howtoruncodebeforealltests【发布时间】:2017-09-0302:44:38【问题描述】:@BeforeAll注释标记了一个方法,该方法要在一个类中的所有测试之前运行。http://junit.org/junit5/docs/c... 查看详情

在intellijrundebug配置中不设置内置(代码片段)

...按钮,那么构建操作将被删除,并且在启动测试之前不会运行任何内容。注意:在运行测试之前默认构建的目的是确保测试使用最新代码运行。如果删除此操作,则测试可能无法使用最新代码运行。有关详细信息,请参阅thedocs... 查看详情

在 py.test 中的每个测试之前和之后运行代码?

】在py.test中的每个测试之前和之后运行代码?【英文标题】:Runcodebeforeandaftereachtestinpy.test?【发布时间】:2014-05-0221:17:49【问题描述】:我想在我的测试套件中的每个测试之前和之后运行额外的设置和拆卸检查。我查看了固定... 查看详情

如何在 Xcode 中运行 OCUnit 测试的子集

】如何在Xcode中运行OCUnit测试的子集【英文标题】:HowdoIrunasubsetofOCUnittestsinXcode【发布时间】:2009-08-3002:59:34【问题描述】:我有一套单元测试,我在签入我的项目之前会使用它们。但是,通常情况下,只有其中一个在代码中发... 查看详情

如何在代码块中运行我的程序之前设置/取消设置环境变量

】如何在代码块中运行我的程序之前设置/取消设置环境变量【英文标题】:Howtoset/unsetenvironmentalvariablesjustbeforetorunmyprograminCodeBlocks【发布时间】:2018-05-3109:01:00【问题描述】:我正在使用Code::Blocksfortran项目fork,svn11210sdk版本1.32... 查看详情

testng注解使用(代码片段)

...试的一部分@BeforeMethod 注解的方法将在每个测试方法运行之前运行@AfterMethod 注解的方法将在每个测试方法运行之后运行@BeforeClass 注解的方法将只运行一次,在当前类中所有方法运行之前调用@AfterClass 注解的方法将... 查看详情

如何在 Xcode 中运行单个 UI 测试

】如何在Xcode中运行单个UI测试【英文标题】:HowtorunsingleUItestinXcode【发布时间】:2019-06-1810:29:29【问题描述】:当我在XCode的测试导航器中运行测试时,它总是从第一个测试用例开始运行。当我选择第二个、第三个等时,它将始... 查看详情

使用 Test::Unit,如何在所有测试(但不是每个测试)之前运行一些代码?

】使用Test::Unit,如何在所有测试(但不是每个测试)之前运行一些代码?【英文标题】:WithTest::Unit,howcanIrunabitofcodebeforealltests(butnoteachtest)?【发布时间】:2011-10-1116:36:31【问题描述】:在我使用test::unit的测试应用程序中,我需... 查看详情

在 Jest 中的每个测试之前运行全局测试设置

】在Jest中的每个测试之前运行全局测试设置【英文标题】:RunningaglobaltestsetupbeforeeachtestinJest【发布时间】:2018-07-2105:35:51【问题描述】:我正在尝试在我的Jest测试套件中的每个测试之前执行测试设置功能。我知道我可以使用bef... 查看详情

在每次测试运行之前清除cursiverepl状态(代码片段)

...的TDD工作流程时遇到了一些困难。我的问题是后续的测试运行取决于REPL中的状态。例如,假设您有以下代码。(defsayHello"hello")(deftesttest-repl-state(testing"testingstateintherepl"(is(="hello"sayHello))))如果使用“工具->REPL->在REPL中以当前ns... 查看详情

在所有测试运行后开玩笑清理

】在所有测试运行后开玩笑清理【英文标题】:Jestcleanupafteralltestshaverun【发布时间】:2017-05-1000:32:50【问题描述】:是否可以在Jest中运行在所有其他测试完成后运行的清理或拆卸任务?类似于setupFiles允许在任何测试运行之前设... 查看详情

rust入坑指南:步步为营(代码片段)

...行集成测试。那么我们就来模拟一下日常开发过程中应该如何来写测试。单元测试我们仍然是用上面的项目,先来在src/lib.rs中写一段“业务代码”pubfnadd_two(a:i32)->i32internal_adder(a,2) 查看详情

如何在 Xcode 中运行单个测试用例?

】如何在Xcode中运行单个测试用例?【英文标题】:HowtorunsingletestcaseinXcode?【发布时间】:2010-08-0403:20:59【问题描述】:我知道最好在进行任何更改后运行所有单元测试用例,以确保不会破坏任何内容。但是,有时,例如调试,... 查看详情

Codeception CEST 接受测试,如何在每次测试之前重新运行 __bootstrap 代码?

】CodeceptionCEST接受测试,如何在每次测试之前重新运行__bootstrap代码?【英文标题】:CodeceptionCESTacceptansetests,howtorerun__bootstrapcodebeforeeachtest?【发布时间】:2016-08-2314:50:55【问题描述】:我正在使用Codeception对我的代码进行验收测... 查看详情

使用 SBT 如何在运行测试之前对插件中的任务进行排序

】使用SBT如何在运行测试之前对插件中的任务进行排序【英文标题】:WithSBThowdoIsequencetasksfrompluginbeforerunningatest【发布时间】:2015-08-2714:23:36【问题描述】:如何在运行测试之前运行来自插件(如flyway)的顺序任务,例如,如果... 查看详情