测试私有函数的惯用方法是啥?

Posted

技术标签:

【中文标题】测试私有函数的惯用方法是啥?【英文标题】:What is the idiomatic way to have a private function tested?测试私有函数的惯用方法是什么? 【发布时间】:2015-10-23 12:41:46 【问题描述】:

Rust 书 says 指出使用“测试”模块是进行单元测试的惯用方式。但是,如果该功能未标记为“pub”,则我无法从测试模块中的超级模块中看到该功能。那么应该如何测试内部功能呢?

我的第一直觉是寻找#ifdef 关键字pub 的方法。我过去曾为 C++ 测试做过这个。对于 Rust,我所做的只是在模块中测试私有函数,然后在“测试”模块中测试公共接口。

我做得对吗?

【问题讨论】:

【参考方案1】:

将您的测试模块嵌套在包含私有方法或结构的模块中:

mod inners 
    fn my_func() -> u8  42 

    mod test 
        #[test]
        fn is_answer() 
            assert_eq!(42, super::my_func());
        
    

当然,我不同意你应该测试一般的私人东西,但那是不同的讨论。

【讨论】:

我一开始是这样做的,但我正在做use super::*。如果我只是明确地use super::some_function 它就像你描述的那样工作。谢谢。 @SeanPerry AFAIK glob 导入不包括函数,只包括类型。我使用 glob 导入的少数情况之一是在编写测​​试模块时,因为我通常想测试父模块中的所有内容。 @Shepmaster 在mod test 上使用#[cfg(test)] 不是一个好习惯吗?【参考方案2】:

测试私有函数的惯用方法是不测试。单元测试应该测试一个类的公共行为。私有方法只是您应该测试的上述公共方法的实现细节。

【讨论】:

我有简单的内部结构,不记录或打印或任何东西。调用它们的公共程序确实如此。所以我的单元测试是安静的、幂等的等。这不是测试通常隐藏在代码私有区域中的外部访问。 @SeanPerry 我不同意经常测试外部访问。事实上,将纯逻辑公开为公共函数或方法允许下游消费者更好。你可以测试你的库的公共接口和用户处理 IO 位。 有时您需要访问实现细节才能通过公共 API 触发特定行为。一个简单的例子是测试数组排序方法:少量,即。大约 10 个元素,使用冒泡排序而不是快速排序(或类似的)通常更快。阈值是一个私有的实现细节,但您需要知道它才能可靠地触发测试中的两个代码路径。

以上是关于测试私有函数的惯用方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用指向类私有方法的指针的命名参数惯用语

私有成员是不是应该在惯用的 C# 中显式声明为私有? [关闭]

Python-伪私有属性

在 PHP 中保持 MySQL 凭据私有的最佳方法是啥?

在公共函数中使用私有类型的最佳方式是啥? [复制]

如果成功,从没有结果的函数返回错误的惯用方法是啥?