外部库的半自动化测试和容易出错的交互

时间:2010-03-02 19:43:40

标签: unit-testing testing automated-tests

最近我一直试图在我的代码中使用单元测试,我原则上喜欢这个想法。但是,我最渴望测试的代码部分是容易出错的区域,单独的单元测试不能很好地处理;例如:

  • 网络代码
  • 文件系统交互
  • 数据库交互
  • 与硬件通信(例如通过RS-232通话的专用设备)
  • 致电古怪的第三方图书馆

我知道模拟对象通常用于这些情况,但我正在寻找一种方法来确信模拟对象正确模拟我想要测试的情况。

例如,假设我想编写一个模拟模拟重启数据库服务器时发生的事情的模拟器。为此,我想首先验证我正在使用的数据库库是否会在重新启动数据库服务器时实际抛出特定异常。现在,我写代码如下:

def checkDatabaseDropout():
    connectToDatabase()
    raw_input("Shut down the database and press Enter")
    try:
        testQuery()
        assert False, "Database should have thrown an exception"
    except DatabaseError, ex:
        pass

运行它需要相当多的人工干预,但至少它给了我一套可验证的假设,我可以在我的代码中使用它,它让我在升级库时检查这些假设,切换到不同的基础数据库等

我的问题是:有更好的方法来处理这个问题吗?是否有框架支持这种半自动化测试?或者人们通常在测试频谱的这一端使用其他技术?

1 个答案:

答案 0 :(得分:1)

我尽量不预见到这些事情。

即使我接近100%的TDD,在一天结束时,我仍然在构建一个完整的系统,所以我还测试整个应用程序是否按预期运行。此类系统测试可以捕获并重现您所谈论的场景。

一旦我知道如何重现给定的场景,我总是可以编写一个单元测试来重现它。

换句话说,我目前倾向于使用两种配置:

  • 全自动单元测试
  • 手动系统测试。

这些可以相互作用并相互馈送,反复地使每个更容易和更好地使用。