【发布时间】:2013-12-20 18:48:10
【问题描述】:
我们正在 VS2013 上用 MVC/C# 编写一个应用程序。
我们使用 selenium web 驱动程序进行 ui 测试,并围绕它编写了一个框架,以使该过程更具声明性和更少程序性。这是一个例子
[Test, Category("UITest")]
public void CanCreateMeasureSucceedWithOnlyRequiredFields()
{
ManageMeasureDto dto = new ManageMeasureDto()
{
Name = GetRandomString(10),
MeasureDataTypeId = MeasureDataTypeId.FreeText,
DefaultTarget = GetRandomString(10),
Description = GetRandomString(100)
};
new ManageScreenUITest<MeasureConfigurationController, ManageMeasureDto>(c => c.ManageMeasure(dto), WebDrivers).Execute(ManageScreenExpectedResult.SavedSuccessfullyMessage);
}
Execute 方法获取 DTO 中的值并调用 selenium.sendKeys 和一堆其他方法来实际执行测试、提交表单、断言响应包含我们想要的内容。
我们对这个框架的结果很满意,但我想到类似的东西也可以用来创建负载测试场景。
IE,我可以有另一个 UI 测试框架的实现,它使用 HTTPWebRequest 向 Web 服务器发出请求。
从那里,我基本上可以“组合”我的测试来创建一个场景,例如:
public void MeasureTestScenario()
{
CanListMeasures();
CanSearchMeasures();
measureId = CanCreateMeasure();
CanEditMeasure(measureId);
}
谜题中缺少的部分是如何在负载下运行这些“场景”? IE,我正在运行一个可以执行 1..N 并行测试的测试运行,希望能做一些事情,比如加速时间、每个场景之间的随机等待等。理想情况下,并发测试的数量可以在运行时配置时间也是如此,即产生另外 5 个测试线程。报告并不是很重要,因为我可以将执行时间记录为 Web 请求的一部分。
也许还有另一种方法,例如,使用 C# 来控制更传统的负载测试工具?
这种方法的真正优势在于处理更复杂的屏幕,即包含对象集合的屏幕。我可以从数据库中获取随机父记录,使用我现有的自动映射器代码创建嵌套的 dto,让代码遍历该 dto 更改随机值,然后使用我的测试框架将该 dto 的值作为 Web 请求提交。比手动编写 JMeter 脚本要容易得多。 干杯, 戴夫
【问题讨论】:
-
这听起来不适合单元测试。有多种工具可以对网站进行负载测试,但应使用单元测试来测试尽可能小的单元,以确保其按预期执行。
-
我完全同意,这与单元测试无关。我们有一套完整的单元测试,它们是小型的、集中的等。我们还有集成测试、配置创建测试,甚至我们作为 nUnit 测试运行的 Web/UI 测试,其中一些在 nCrunch 下(用于真正的单元和一些集成测试)和一些使用 DXCore 测试运行器(用于 UI 测试)。对我们来说,NUnit 是一种为各种测试执行代码和断言结果的便捷方式。
-
如果您的测试记录了足够的数据以便您从中提取性能信息,NUnit 可以正常工作。如果您有良好的日志记录,那么编写一个日志解析器来为您运行的所有测试提供性能信息并不难。
-
我不认为日志记录会太难——困难的部分是:nUnit 正在寻找一个可以并行执行测试并允许动态增加/减少线程数的测试运行.
标签: c# unit-testing load-testing performance-testing