如何在Python计划作业中单元测试助手方法?

如何在Python计划作业中单元测试助手方法?,python,unit-testing,Python,Unit Testing,我在这里已经阅读了很多关于在我的单元测试中测试助手方法(不一定是私有的)的答案,但我仍然不确定对于我目前的情况,最好的方法应该是什么 我目前有一个逻辑块,作为计划作业运行。它做了很多相关的事情,比如更新本地存储库、转换文件类型、提交给其他repo、清理旧repo等等。我需要所有这些代码以特定的顺序运行,而不是设置一堆计划的作业,我使用了很多这样的小方法,并将它们放在一个大方法中,以强制执行代码的运行顺序: def mainJob(): sync_repos() convert_f

我在这里已经阅读了很多关于在我的单元测试中测试助手方法(不一定是私有的)的答案,但我仍然不确定对于我目前的情况,最好的方法应该是什么

我目前有一个逻辑块,作为计划作业运行。它做了很多相关的事情,比如更新本地存储库、转换文件类型、提交给其他repo、清理旧repo等等。我需要所有这些代码以特定的顺序运行,而不是设置一堆计划的作业,我使用了很多这样的小方法,并将它们放在一个大方法中,以强制执行代码的运行顺序:

def mainJob():
    sync_repos()
    convert_files()
    commit_changes()

等等。现在我不知道如何为这个东西编写测试。对整个
mainJob()
函数进行测试是令人沮丧的,因为它可以做很多事情,而且实际上更具有可靠性。我看到很多人说我应该只测试公共接口,但我担心可能会有没有直接验证的代码

正如您所发现的,单元测试将发现由紧密耦合的代码引起的设计问题,因为这种形式的测试非常倾向于公开公共接口的单个单元的代码。这些基本上就是您需要测试的,至少确保所有代码路径都被覆盖(通过覆盖率检查),然后实现按顺序运行的管理类,并测试这些命令是否得到遵守,如果需要的话,最后用一个集成测试来结束这一切。我也不确定在这种情况下我应该怎么做。这些函数正在对文件系统进行实际更改,所以我不能模拟对象。也许我可以使用StringIO对象来表示打开的文件。这只是一个棘手的情况。模拟写入文件系统的StringIO是一个不错的选择。此外,mock实际上支持使用一个。这也是另一个很好的选择。考虑到您提到您正在接触多个外部系统,Mocking是一个非常好的选择。您可能不希望您的测试影响它们。是的,我想我最后要做的是稍微更改一下包装器实现,以便它将
open
对象传递给helper方法。这将很容易转化为测试中的模拟。我有一些自包含的函数,它们只是检查和构建目录,因此我想为此我将模拟数据库,以便它们处理测试数据,并且我将创建一组单独的测试目录,在测试开始和结束时
putUp
tearDown
,这样就不会涉及任何实际内容。