.NET自动化测试长时间运行的进程

6
我们希望对一个需要将数据发送到外部源并验证数据是否正确显示在其网站上的过程进行自动化集成测试。但是,在数据出现在网站上之前可能需要几个小时。
传统的 NUnit 或 MSTest 的问题在于测试会因等待结果而被阻塞数小时。我看到了 PNUnit,它可以用来并行运行所有测试,但这对我来说似乎不是一种优雅的解决方案。如果有 1000 个测试怎么办?这不会在服务器上创建大量进程/线程吗?如何跟踪所有这些进程?
那么,有人解决了这个问题吗?你是自己开发了一个解决方案,还是使用了开源解决方案?

谢谢大家的回答。好主意。我希望能得到已经实现过这样东西的人的回复。我认为最好的方法是刻苦学习一些C#,从头开始创建一些东西。我不确定NUnit/MSTest等工具是否能以优雅的方式完成这项任务。 - Martin Capodici
1
我认为你的测试范围太广了,包含了许多可能出错但不在你的代码范围之内的条件。因此,它不再是一个“单元”测试,而是一个“系统”测试,这就是为什么你发现很难将其适应于单元测试模型的原因。单元测试应该是小而孤立的功能块(“单元”),通常作为构建过程的一部分运行。我认为你正在寻找更多的系统测试,并且应该寻找诸如负载测试工具或客户端仿真测试工具等工具......许多这些工具都是为长时间运行的进程而构建的。 - BenSwayne
4个回答

2

通过分离测试数据的插入和验证,可以很容易地解决这个问题。只需将所有可用的测试数据加载到系统中,等待几个小时直到处理完成,然后执行验证测试。


好主意。但我认为没有任何测试框架适用于这种情况?例如,NUnit只能运行测试并判断其是否通过或失败。您是建议从其他进程中持续运行测试,然后使用NUnit验证收集的数据库数据是否在过去一天内正确吗? - Martin Capodici
所有的框架都适用于这种技术!你只需要加载一些预定的测试数据,稍后再查找,或者在你的“插入/上传”测试中将测试数据保存到文件系统中,然后在你的“验证”测试中读取该文件以进行检查。关键是时机,这就是为什么我认为这不是一个合适的单元测试,而是一个“系统测试”的原因。 - BenSwayne
单元测试框架通常具有“SetUp”功能,通常用于为测试准备环境。您可以使用它向系统中插入测试数据。http://www.nunit.org/index.php?p=setupFixture&r=2.4 - Yauheni Sivukha
Ben,感谢你的回答,但 NUnit、MSTest 等并不是为此设计的。它们完全是同步的,一次性运行,通过或失败。也许有一个测试框架可以处理长时间运行的异步操作,并提供适当的接口和工具集。我希望有人知道这样一个框架以及如何使用它。 - Martin Capodici

1

看起来PNUnit可能是一个不错的解决方案。如果你担心服务器上有“太多进程/线程”,只需限制PNUnit可以同时运行的测试数量(比如,最大N);当一个测试完成后,再安排下一个测试。我并不断言PNUnit知道如何做到这一点;你可能需要自己实现这个定制功能。


0

谢谢,我认为他们也在苦苦寻找解决方案。也许这个问题目前太难了 :-) - Martin Capodici

0
Martin,在我提供解决方案之前,对于单元测试来说,似乎您只想测试您可以控制的内容。上述更像是我所谓的回归测试。我假设“他们”的网站是别人的网站。如果您遵循接口/集成规则但什么也没有显示在他们的屏幕上,那会发生什么?虽然这可能是一个问题,但您会怎么做呢?此外,当他们更改他们的网站或算法时会发生什么?您最终需要根据他们的操作编写代码,这很糟糕。
话虽如此,就像上面提到的那样,您可以将加载测试和验证数据测试分开。我承认我对PNunit一无所知,但仅仅向其投放线程并不能解决每次往返测试需要3小时的延迟问题。
如果您需要同步运行,您可以在ClassInitialize()中加载所有数据,然后睡眠直到验证并运行实际测试的时间。
如果是我,我只会为加载测试创建一个测试项目,然后再为几个小时后验证结果创建一个项目。同步运行似乎不会给您带来太多好处,除了确保先决条件通过以便测试结果,这也可以用其他方式处理。

谢谢您的建议。看起来现在先加载再验证似乎很受欢迎。问题是没有框架支持这一点,所以选项只有“自己动手”或发起一个开源倡议。 - Martin Capodici
我试图解释为什么我认为没有框架做到这一点,很可能是因为另一个网站是一个黑盒子,并且验证该黑盒子的测试应该在该解决方案中,而不是在使用应用程序中,但这只是我的观点。与关注点分离的概念相近。 - Rob Allen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接