在TestNG中,我正在尝试使用singleThreaded=true
注释@Test
注释。我已经提到了http://testng.org/doc/documentation-main.html和
http://beust.com/weblog2/archives/000407.html但是没有多大帮助。
我的问题:为什么我们需要在单线程上执行方法。在多线程上运行可以节省时间。
注意:在http://beust.com/weblog2/archives/000407.html
中给出的示例中他说::"两种测试方法testf1()
和testf2()
分别测试方法A#f1
和A#f2
,但当你要求TestNG运行这些方法时在并行模式下测试,这两种方法将从不同的线程调用,如果它们不能正确地彼此同步,你很可能最终会处于腐败状态。
任何人都可以用代码解释上面的例子
答案 0 :(得分:1)
正如此处所解释的那样http://beust.com/weblog2/archives/000407.html ...如果您正在测试的类不是多线程安全的......
因此,您的测试可以并行运行,但如果您正在测试非线程安全的类,则可能会破坏。
例如,一个测试调用a.f1()
,第二个调用a.f2()
。如果这些方法使用对象this.a = new A()
中的某些共享资源并且彼此依赖,则很可能最终处于损坏状态,对象为this.a
。
答案 1 :(得分:1)
我最近使用了这个设置,因为测试需要这样做。 例如,我们有 entity1 和 entity2 我们对这些实体进行一些操作,一次只允许对实体进行一次操作,如果用户尝试运行多个操作,则会将冲突错误返回给用户。 要测试所有场景,必须一次执行一个测试。要实现该测试必须在单线程模式下运行。
更新了一个例子 以下是基于真实世界场景的虚构示例。 我们有收集温度和湿度的设备。我们有固定数量的设备在较低的环境中进行测试。 设备一次只能执行一项任务。
class XDevice {
private String id;
}
class WorkOrchestrator {
public long createWork(Collection<String> devices, WorkTypeEnum workType) {
if(areDevicesBusy(devices)) {
//devices are already performing some work
throw new ConflictException();
} else {
if (workType == TEMPERATURE) {
handleTemperature(devices);
} else if (workType == HUMIDITY) {
handleHumidity(devices);
}
}
}
}
class TemperatureHandler {
public handleTemperature(Collection<String> devices) {
//handle temperature related stuff
}
}
class HumidityHandler {
public handleHumidity(Collection<String> devices) {
//handle humidity related stuff
}
}
@Test(SingeThreaded = true)
class XDeviceIT {
//we have fixed list of devices for testing
private Collection<XDevice> devices;
@Test
public testAverageTemperatureCollectedFromDevices() {
}
@Test
public testAverageHumidityCollectedFromDevices() {
}
}