如何在TestNG

时间:2015-06-17 05:04:56

标签: java multithreading selenium testng

在TestNG中,我正在尝试使用singleThreaded=true注释@Test注释。我已经提到了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运行这些方法时在并行模式下测试,这两种方法将从不同的线程调用,如果它们不能正确地彼此同步,你很可能最终会处于腐败状态。

任何人都可以用代码解释上面的例子

2 个答案:

答案 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() {
        
    }
}