如何在 TestNG 中实现单 Threaded=true

How to implemet singleThreaded=true in TestNG

在 TestNG 中,我试图了解 @Test 注释的 singleThreaded=true 属性的使用。我已经提到了 http://testng.org/doc/documentation-main.htmlhttp://beust.com/weblog2/archives/000407.html 但没有得到太多帮助。

我的问题:为什么我们需要在单线程上执行方法。 运行 多线程可以节省时间。

注意:在 http://beust.com/weblog2/archives/000407.html

给出的示例中

他说::“这两个测试方法testf1()testf2()分别测试方法A#f1A#f2,但是当你让TestNG去运行 在并行模式下进行这些测试,这两个方法将从不同的线程调用,如果它们不能正确地相互同步,您很可能最终会处于损坏状态。

谁能用代码解释上面的例子

如此处所述http://beust.com/weblog2/archives/000407.html ...如果您正在测试的 类 不是多线程安全的...

因此您的测试可以 运行 并行进行,但是如果您测试的 类 不是线程安全的,那么事情可能会中断。

在示例中,第一个测试调用 a.f1(),第二个测试调用 a.f2()。如果这些方法使用对象 this.a = new A() 中的某些共享资源并且相互依赖 ,您很可能会以对象 this.a.[=15 的损坏状态 告终=]

我最近使用了此设置,因为测试需要这样做。 例如,我们有 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() {
        
    }
}