带参数的并发 JUnit 测试

2023-12-30

所以我尝试运行并行参数化测试。我有一个解决方案,其中相同的测试可以与提供的参数并行运行,例如说我有以下内容:

@Test
public void someTest1(){
}

@Test
public void someTest2(){
}

我可以让 someTest1() 与所有参数同时运行,但 someTest2() 仍然需要等待 someTest1() 在执行之前完成所有参数。我想知道是否有人知道能够同时运行带有所有参数的 someTest1() 和带有所有参数的 someTest2() 的解决方案?我试过了tempus-fugit 并发测试运行器 http://tempusfugitlibrary.org/documentation/junit/parallel/,这对于未参数化的测试非常有用......

下面是我当前并行运行每个参数测试的代码。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.junit.runners.Parameterized;
import org.junit.runners.model.RunnerScheduler;

/**
 * Class used from the following source:
 * http://jankesterblog.blogspot.com/2011/10
 * /junit4-running-parallel-junit-classes.html
 * 
 * @author Jan Kester
 * 
 */
public class Parallelized extends Parameterized {

    private static class ThreadPoolScheduler implements RunnerScheduler {
        private ExecutorService executor;

        public ThreadPoolScheduler() {
            String threads = System.getProperty("junit.parallel.threads", "16");
            int numThreads = Integer.parseInt(threads);
            executor = Executors.newFixedThreadPool(numThreads);
        }

        public void finished() {
            executor.shutdown();
            try {
                executor.awaitTermination(12, TimeUnit.HOURS);
            } catch (InterruptedException exc) {
                throw new RuntimeException(exc);
            }
        }

        public void schedule(Runnable childStatement) {
            executor.submit(childStatement);
        }
    }

    /**
     * Instantiates a new parallelized.
     * 
     * @param klass
     *            the klass
     * @throws Throwable
     *             the throwable
     */
    public Parallelized(Class<?> klass) throws Throwable {
        super(klass);
        setScheduler(new ThreadPoolScheduler());
    }
}

下面的代码是一个示例测试,BaseSuite 不包含任何重要的内容。这些与 selenium 一起使用,因此它只设置 webDriver。 getAllButOpera() 方法返回包含 Internet Explorer、Firefox 和 Chrome 的浏览器类型的集合。这些参数用于同时在 firefox、ie 和 chrome 上运行相同的测试。我想在课堂上同时进行两个测试,这是我遇到的问题。

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.Collection;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
import org.openqa.selenium.WebDriver;


/**
 * The Class SampleSuite1.
 * 
 * @author Reid McPherson
 */
@RunWith(Parallelized.class)
public class SampleSuite1 {
    WebDriver driver;
    /**
     * Data.
     * 
     * @return the collection
     */
    @Parameters
    public static Collection<Object[]> data(){
          List<Object[]> browsers = new ArrayList<Object[]>();
    browsers.add(new String[]{"Firefox"});
    browsers.add(new String[]{"Chrome"});
    browsers.add(new String[]{"IE"});
    return browsers;
    }

    /**
     * Instantiates a new sample suite1.
     * 
     * @param type
     *            the type
     */
    public SampleSuite1(String type){
        switch (type) {
    case "FIREFOX":
        driver = new FirefoxDriver();
        break;
    case "IE":
        driver = new InternetExplorerDriver();
        break;
    case "CHROME":
        System.setProperty("webdriver.chrome.driver", PATHTOCHROMEEXE);
        driver = new ChromeDriver();
        break;
    case "OPERA":
        driver = new OperaDriver();
        break;
    default:
        throw new RuntimeException("Browser type unsupported");
    }
    // Set the timeout.
    driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
    }

    /**
     * Sets the up.
     */
    @Before
    public void setUp() {
        driver.get("http://www.google.com");
    }

    /**
     * Test navigation succeeded.
     */
    @Test
    @TestDescription("Navigation Test")
    public void navigationShouldSucceed() {
        String pageSource = driver.getPageSource();
        assertTrue(pageSource.contains("Google"));
    }

    /**
     * Test title.
     */
    @Test
    @TestDescription("This method tests the web page title.")
    public void titleShouldBeGoogle() {
        assertEquals(driver.getTitle(), "Google");
    }

    @After
    public void finished(){
    driver.close();
    }


}

正如我所说,问题在于 JUnit 的实现。

你可以看到:

Parallelized extends Parametrized extends Suite extends ParentRunner

另一方面:

ConcurrentTestRunner extends BlockJUnit4ClassRunner extends ParentRunner

因此它们来自不同的继承层次。

现在您需要关注的是以下内容的实现:

org.junit.runners.ParentRunner#getChildren

方法。对于 org.junit.runners.BlockJUnit4ClassRunner 来说是:

protected List<FrameworkMethod> computeTestMethods() {
    return getTestClass().getAnnotatedMethods(Test.class);
}

它生成所有带有注释的方法。但对于 org.junit.runners.Parameterized 来说是:

for (int i= 0; i < parametersList.size(); i++)
  runners.add(newtestClassRunnerForParameters(getTestClass().getJavaClass(),
                parametersList, i));

最后一个只提供课程。

建议:用以下定义覆盖您的并行化类org.junit.runners.ParentRunner#getChildren from BlockJUnit4ClassRunner.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带参数的并发 JUnit 测试 的相关文章

随机推荐

  • 如何在TFS构建任务中获取代理用户能力?

    我已经宣布了userTFS 2015 构建代理中名为 MyCapability 的功能 以路径作为值 如何在构建任务的 powershell 脚本中获取此值 env MyCapability and MyCapability不工作 遗憾的是
  • Ajax 和后退按钮。哈希值发生变化,但是之前的页面状态存储在哪里?

    我试图让 ajax 与后退按钮一起工作 但缺少一些核心内容 之前的页面状态存储在哪里 CASE 1 点击 让我变红 ajax事件发生并且页面变成红色 哈希 red 点击 让我变黄 ajax事件发生并且页面变成黄色 哈希 yellow 单击后
  • 在未安装 VB6 的情况下运行 VB6 应用程序

    我的问题是 如果我想运行 VB6 应用程序 我必须在客户端计算机上安装 VB6 其实我的VB6版本 无法制作安装文件 所以我只是手动链接到exe文件 有什么方法可以让我不必安装VB6 只需复制一些文件即可运行该应用程序 Thanks 为了运
  • 模块'对象没有属性'drawMatches' opencv python

    我只是在 OpenCV 中做一个特征检测的例子 该示例如下所示 它给了我以下错误 module 对象没有属性 drawMatches 我已经检查了 OpenCV 文档 但不确定为什么会收到此错误 有谁知道为什么 import numpy a
  • 如何在nodejs的ejs文件中显示警报

    例如 我想访问文档对象并想使用警报 所以我在 ejs 文件中创建了一个函数 我想在出现错误时显示警报 所以我正在渲染我的 ejs 文件并给出 2 个参数 一个是结果 另一个是错误 并希望显示是否有错误 显示警报 res render app
  • 如何避免在 PHP 7 中的每个文件上重新声明刻度

    Overview 在 PHP 5 6 中似乎添加declare ticks 1 然后使用register tick function 将遵循任何包含并相应地提供分析信息 在 PHP 7 中 但现在看来我必须添加declare ticks 1
  • PHP短路惰性求值,php.net手册在哪里?

    抱歉 如果这听起来像是一个非常愚蠢的问题 但我用 Google 搜索了网络 还专门用 Google 搜索了 php net 网站和 stackoverflow com 网站 我知道 PHP 会短路惰性求值使用时and or 运算符 但是 P
  • Django - 连接两个模型

    对于以下模型 我想检索在历史表中具有指定间隔之间的过渡日期的条目的所有设备 class History models Model device models ForeignKey DeviceModel to field id transi
  • INNER JOIN 和锁

    我有两张桌子TableA and TableB其中有我想要同时检索和更新的信息 当我使用 SELECT TOP 2 SomeFieldA FROM TableA WITH ROWLOCK UPDLOCK READPAST 一切正常 进程 1
  • Angular 2 - 让子组件加载到父组件中(动态创建)

    我正在尝试动态创建标头 构造标头模板并将其作为 字符串 传递给我的动态组件 我的要求是在标头组件模板字符串中调用另一个组件并加载它 已经创建了一个工作Plunker https plnkr co edit ENa23Q1Qqtvi46CYn
  • MarkLogic XML 到 JSON 的转换

    我正在尝试将此 XML 文件转换为 JSON 但无法取得任何成功 我的 XML 中有两个子元素 但它只返回最后一个 如何获取 JSON 格式的两条记录 XML
  • 升级到 XCode 13(和 iOS 15)后选项卡和导航栏发生变化

    我有一个 iOS 应用程序 自从升级到 Xcode 13 以来 我注意到一些特殊的变化Tab and 导航酒吧 在 Xcode 13 中 选项卡和导航栏上现在有这个黑色区域 并且在启动应用程序时 选项卡栏和导航栏现在都是黑色的 奇怪的是 如
  • Busboy-connect 在保存文件结束之前触发(node.js,express)

    我使用 Busboy connect 从客户端获取上传数据 我尝试保存数据 然后 on finish 将状态正常返回到服务器 问题是 on finish 在文件保存结束之前触发 我是否做错了什么或者这就是模块的工作方式 服务器端代码 con
  • DialogFragment设置Dialog的高度

    我刚刚使用第一个对话框使用 DialogFragment 创建的 一切都很好 除了我无法让对话框包装它的布局 我的布局具有所有元素的高度wrap content In MyFragmentDialog我什至找不到一种方法来暗示它可以用来设置
  • 如何使用 AngularJS 使用 Json 数据向服务器发送 DELETE 请求?

    我必须向服务器发送 http DELETE 请求 类型必须是 JSON 对象如下所示 id value 我的第一个方法是以下代码 但到目前为止它不起作用 http delete http blabla server house id val
  • 基于成员变量的不同视图/数据模板

    我有一个名为的视图模型 ViewModelClass 其中包含一个布尔值 我有另一个视图模型 其中包含 ObservableCollection
  • Jquery 检测 iframe 内 body 标记的更改或 keyup

    我有一个jwysiwyg http akzhan github com jwysiwyg help examples 01 basic html我的页面上的内容编辑器控件 该控件的工作原理是在 iframe 中创建自身 其中包含完整的 ht
  • 如何一起使用Mercurial、Maven和Eclipse?

    我目前正在与 5 名大学同事组成的团队一起开发 Java 项目 实际上 我们将在接下来的几天内完成规划阶段 然后开始实施 对于该项目 我们必须使用 Mercurial 通过 Bitbucket org 和 Apache Maven 我们想使
  • JAGS 错误 - 可能涉及以下部分或全部节点的有向循环

    完整数据集包含约 11 000 行 我一直在使用 K 400 运行代码 同时检查代码是否运行 所有行都与地图上的特定单元格相关 并包含从 Sentinel 2 图像和数字高程地图中提取的信息 117 个细胞的子集还包含实地考察中记录的栖息地
  • 带参数的并发 JUnit 测试

    所以我尝试运行并行参数化测试 我有一个解决方案 其中相同的测试可以与提供的参数并行运行 例如说我有以下内容 Test public void someTest1 Test public void someTest2 我可以让 someTes