如何在瞬态系统资源限制条件下编写单元测试来检查正确的行为?

时间:2015-12-16 18:09:27

标签: python unit-testing docker virtual-machine nose

我有一个Python 3应用程序,它使用multiprocessing模块并行地在许多CPU上传播大量资源密集型科学计算。计算中有几个步骤需要进程分配适度大的数组。当我在OS X笔记本电脑上运行应用程序时,该应用程序运行正常,但是,长期计划是它通常从docker容器内部运行,而docker容器将在Amazon Web Services EC2实例或其他实例上运行可比较的基于云的虚拟机 - 有效地将应用程序嵌套在两个级别的机器虚拟化技术中。

我预计将来,其他一些用户可能会尝试运行应用程序,并将虚拟机资源(内存,交换空间等)配置为已设置得过于小的值。 (有明确的财务激励措施,因为您倾向于为云计算服务支付更少的费用,您使用的资源越少。)

在严格限制的资源场景下,这可能会导致其中一个进程在暂时无法获得足够大的内存块时尝试为阵列分配内存,从而触发Python {{ 1}}例外。

此问题的解决方案可能类似于下面的代码段:尝试分配内存,如果发生则捕获异常,然后等待一段时间再试一次:

MemoryError

我的问题:如何构建单元测试以验证等待行为?或者甚至可能吗?看起来我必须编写一个测试,通过首先占用我系统上的大部分内存资源来设置自己,然后在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 函数开始执行时等待一段时间,然后释放资源以便getHugeArray()可以抓取它们,并最终检查getHugeArray()函数是否返回正确的返回值。

这是在集成测试框架中尝试做的更好,而不是作为单元测试吗?或者在任何情况下,在这种情况下我可以使用什么样的工具或测试框架来测试我的代码,我应该如何设置它?

0 个答案:

没有答案