在Python中,如何编写单元测试以访问私有属性而不暴露它们?

14 投票
2 回答
18816 浏览
提问于 2025-04-17 05:52

我正在努力改进我为Python程序编写单元测试的方式。我发现有时候,能够访问私有成员会非常有帮助,这样可以确保某个方法正常工作。举个例子,当我想测试一个没有返回值(除了None)的函数时,这种情况就很常见。我知道一个简单但错误的方法就是把私有属性改成受保护属性,然后直接测试它们。不过,我希望找到一种方法,不用过多暴露接口。

那么,我该如何在类中测试私有属性,而不把它们暴露在接口中?或者,如果有更好的方法来测试这种情况,以至于不一定需要访问私有属性来进行有效的单元测试呢?

2 个回答

23

在Python中,没有什么是完全私密的。如果你在成员变量前面加了两个下划线,这个名字只是被“改名”了。你可以通过一种特定的方式来访问它,格式是 _类名__成员。这样就可以访问到类 类名 中的 __成员 变量。

你也可以看看这个问题: 为什么Python的“私有”方法实际上并不私有?

4

我想换个角度来讲这个问题...

试着写一些单元测试,关注公共行为而不是内部状态。比如说,你有一个叫做A()的方法,它会改变一些内部状态。如果你调用了这个方法,状态发生了变化,那么在你的小代码世界里肯定会有一些可观察的变化。也许B()现在的表现就不一样了。所以我的测试会是...(简单化这个例子)

void MyTest()
{
   Assert.That(B(), Is.False);
   A();
   Assert.That(B(), Is.True);
}

避免测试和被测试的对象之间出现不当亲密的情况。

撰写回答