如何编写一个unit testing来检查在瞬态系统资源约束条件下的正确行为?

我有一个Python 3应用程序,它使用多处理模块并行地在许多CPU上分布大量的资源密集型科学计算。 计算中有几个步骤要求进程分配适度大的数组。 当我在OS X笔记本电脑上运行该应用程序时,该应用程序运行良好,但长期计划是,它通常会从Docker容器中运行,然后运行在Amazon Web Services EC2实例或其他类似云的虚拟机 – 将应用程序embedded到两个级别的机器虚拟化技术中。

我预计未来,其他一些用户可能会尝试运行带有虚拟机资源(内存,交换空间等)的应用程序,该资源被configuration为设置的值太小,太小。 (有明确的财务激励措施可以做到这一点,因为您对云计算服务的支付往往较less,所用的资源也较less。)

这就提出了在严格限制资源的情况下,当一个足够大的内存块暂时不可用时,其中一个进程可能会尝试为数组分配内存,从而触发Python MemoryErrorexception。

这个问题的解决scheme可能看起来像下面的代码片段:尝试分配内存,如果发生exception,请稍等片刻,然后再试一次:

 import numpy as np import time import datetime import os from warnings import warn def getHugeArray(n, retry=1, warnuser=5): # Don't retry too often if retry < 0.1: retry = 1 # Don't send a useless flood of warning messages if warnuser < retry: warnuser = retry success, outarray = False, None startwait, lastcount = datetime.datetime.now(), 0 # Keep re-asking the OS for memory allocation until the OS gives it to us while success is False: try: outarray = np.zeros(n) success = True except MemoryError: time.sleep(retry) wait = (datetime.datetime.now()-startwait).total_seconds() newcount = int(wait/warnuser) if newcount > lastcount: msg = 'PID {0}: waiting for memory allocation for {1} seconds' warn(msg.format(os.getpid(), wait)) lastcount = newcount return outarray 

我的问题:我将如何构build一个unit testing来validation等待的行为? 或者甚至有可能? 看来我必须编写一个testing,通过首先占用系统上的大部分内存资源,然后等待getHugeArray()函数开始执行一段时间,然后释放资源,以便getHugeArray()可以抓住它们,并最终检查getHugeArray()函数是否返回正确的返回值。

这是否是在集成testing框架而不是unit testing中更好的做法呢? 或者无论如何,在这种情况下我可以使用什么样的工具或testing框架来testing我的代码,我应该如何设置它?