繁体   English   中英

当使用工厂和数据提供者注释方法时,如何限制特定方法仅执行一次?

[英]How to restrict the particular method to be executed once only, When factory and dataprovider annotation method is used?

  1. 我正在自动化数据库自动化。 我在输入中使用@factory和@Dataprovider批注。
  2. 我想限制此方法,只要getCountOfPt1(poiLocId)即可单独运行
  3. 我也尝试设置布尔值,但是失败,因为我使用的是工厂以及dataprovider注释。
  4. 我只想限制执行一次的代码是
 String pt1 = null; if(!alreadyExecuted) { Map<String, Integer> records = DbMr.getCountOfPt1(poiLocId); pt1 = getMaxKey(records); LOG.debug("Max key value is...." + pt1); if (StringUtils.isBlank(pt11)) { records.remove(null); pt1 = getMaxKey(records); alreadyExecuted = true; } } 

注意:我在此方法中传递的poiLocId来自工厂方法

@Factory
public Object[] factoryMethod() {
    Object[] poiLocIdData = null;
    if (StringUtils.isNotBlank(cityName)) {
        List<String> poiLocId = DbMr.getPoiLocId(cityName);

        int size = poiLocId.size();
        poiLocIdData = new Object[size];
        for (int i = 0; i < size; i++) {
            poiLocIdData[i] = new CollectsTest(poiLocId.get(i));
        }
    } else {
        LOG.error("The parameter is required: Pass City Name");
        Assert.fail("Problems with parameters");
    }

    return poiLocIdData;
}

public CollectTest(String locationId) {
    poiLocId = locationId;
    this.reportsPath = "reports_" + cityName;
    this.extent = new ExtentReports();
}

@DataProvider(name = "pData")
public Object[][] getPData() {
    List<PData> pList = DbMr.getCollectionPs(poiLocId);

    Object[][] testData = new Object[pList.size()][];
    for (int i = 0; i < poiList.size(); i++) {
        testData[i] = new Object[] { pList.get(i) };
    }
    return testData;
}

@BeforeClass
private void setup() throws Exception {
    ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(reportsPath + "/" +
     cityName + "_extent.html");
     htmlReporter.loadXMLConfig("src/test/resources/extent-config.xml");
    extent.attachReporter(htmlReporter);
}

@Test(dataProvider = "pData")
public void verifyData(PData pData) throws Exception {
    extentTest = extent.createTest(pData.toString());
    String pt1 = null;
    if(!alreadyExecuted) {
    Map<String, Integer> records = DbMr.getCountOfPt1(poiLocId);
    pt1 = getMaxKey(records);
    LOG.debug("Max key value is...." + pt1);
    if (StringUtils.isBlank(pt11)) {
        records.remove(null);
        pt1 = getMaxKey(records);
        alreadyExecuted = true;
    }
    }

    if (pt1.equalsIgnoreCase("xxxx")) {
        Assert.assertEquals(pData.getpt1(), "xxxx");

        }

由于@factory和@DataProvider与测试类的实例一起使用,因此请尝试使“ alreadyExecuted”变量成为静态变量。(因为静态变量处于类级别”)

以下代码可以正常运行,并且只能运行一次,而我使用map只能执行一次。

// declare it as global variable
private static Map<String, String>LOC_ID_AND_PT1_COUNT_MAP = new HashMap();

//test method
@Test(dataProvider = "pData")
public void verifyData(PData pData) throws Exception {
    extentTest = extent.createTest(pData.toString());
    String pt1 = LOC_ID_AND_PT1_COUNT_MAP.get(LocId);
        if (pt1 == null) {
    Map<String, Integer> records = 
  DbMr.getCountOfPT1(LocId);
            pT1 = getMaxKey(records);
            LOG.debug("Max key value is...." + pt1);
            if (StringUtils.isBlank(pt1)) {
                records.remove(null);
                pt1 = getMaxKey(records);
                LOG.debug("Max key value is...." + pt1);
            }

            LOC_ID_AND_PT1_COUNT_MAP.put(locId, pt1);
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM