多个进程之间的单元测试交互

Posted

技术标签:

【中文标题】多个进程之间的单元测试交互【英文标题】:Unit Testing interactions between multiple processes 【发布时间】:2014-03-21 15:03:40 【问题描述】:

我正在编写一个通过 Accessibility API 与其他程序交互的 Cocoa 程序。为了测试这些交互,我想启动一个小型测试程序并让我的测试对其进行操作。为了验证测试结果,我考虑过通过分布式对象查询测试器。例如,我启动测试器,它的主窗口出现,我的测试运行将窗口移动到特定位置的代码,然后通过分布式对象查询测试器程序以验证窗口是否已移动到正确的位置。

我有通过 NSTask 启动测试器的工作代码,还有一些通过分布式对象传达我需要的结果的工作代码,但它只有在我在测试代码之前手动启动测试器时才有效。

我一直坚持使用 XCTest 自动化整个测试。在 setUp 方法中,我通过 NSTask 启动测试程序,但是在运行测试之前我必须等待它完成启动。因此,在测试人员内部,我想我会通过 NSDistributedNotificationCenter 发出通知,并在开始测试之前等待测试代码中的通知到达。但我不确定在通知到达之前我应该​​如何阻止测试。

我考虑过启动一个线程来等待通知并在主线程的标志上忙等待,但 NSDistributedNotificationCenter 仅在主线程上发布通知。

也许有更简单的方法来同步我的测试代码和测试器进程,而我的想法太复杂了?

【问题讨论】:

How to unit test asynchronous APIs? 可能会有所帮助。 【参考方案1】:

我成功完成了第一部分,即从 setUp 方法中接收分布式通知,让 currentRunLoop run 一会儿:

- (void)setUp

    [super setUp];

    [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(testerRunningNotification:) name:@"TesterReady" object:nil];

    _t = [NSTask launchedTaskWithLaunchPath:[NSBundle.mainBundle.bundlePath stringByAppendingPathComponent:@"../Tester.app/Contents/MacOS/Tester"] arguments:@[]];

    while(!_testerRunning)
    
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    


- (void)testerRunningNotification:(NSNotification *)notification

    _testerRunning = YES;

现在我只需要弄清楚要让分布式对象在测试用例中工作需要什么。

【讨论】:

原来分布式对象问题是一个编码错误。一切正常。

以上是关于多个进程之间的单元测试交互的主要内容,如果未能解决你的问题,请参考以下文章

软件测试的分类

单元测试的方法

单元测试——使用模拟对象做交互测试

《Google软件测试之道》

python单元测试

单元测试术语的概述(存根与模拟,集成与交互)?