You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

命令行设置系统属性后无法在Cucumber步骤定义中访问的问题

问题描述

执行的命令行

mvn test -Dcucumber.options="--name 'Approve Rejected Creative'" -DEnvironment="Prod"

Feature 文件内容

Given User launch "<Environment>" preflight
          When User enters Email as "zzzz" and Password as "zzzz"
          Then Click on Login
          When User approves <creativeNumber> creative starting from row <startRow>
          Then the creative should be approved

步骤定义代码

public void launchPreflight(String Env) {
        // Set up WebDriver and launch the preflight URL
        System.setProperty("webdriver.chrome.driver", 
                "/chromedriver/chromedriver");
        driver = new ChromeDriver();
        Env = System.getProperty("Environment");
        if(Env.contains("Prod") || Env.contains("prod") || Env.contains("PROD")) {
        driver.get(Prod_URL);
        }

运行报错

[ERROR] Cannot invoke "String.contains(java.lang.CharSequence)" because "Env" is null

作为代码新手,我尝试在测试运行器文件中设置属性,但问题依旧,想知道自己遗漏了什么?


问题分析与解决
  • 参数逻辑冲突导致空指针
    你的步骤定义方法launchPreflight接收了Feature文件<Environment>传递的参数,但之后又用Env = System.getProperty("Environment")覆盖了这个变量。如果Feature里没有给<Environment>传值(比如缺少Scenario Outline的Examples表格),初始Env就是null;要是系统属性读取失败,覆盖后还是null,调用contains就会触发空指针错误。

  • 系统属性读取失败的排查点

    1. 检查Maven命令的参数格式:-DEnvironment="Prod"本身没问题,但要注意shell的引号转义问题,比如有些终端下引号可能被吃掉,导致参数没传进去。可以在代码里加一行System.out.println(System.getProperty("Environment")),确认是否能读到值。
    2. 检查测试运行器:如果用了JUnit的@CucumberOptions或者其他运行器,确保它没有覆盖或屏蔽Environment这个系统属性。
  • 具体修复方案

    方案一:直接用系统属性(推荐)

    既然命令行已经传了系统属性,就不需要从Feature文件传参了:

    1. 修改Feature步骤:
      Given User launch preflight
      
    2. 修改步骤定义:
      public void launchPreflight() {
              System.setProperty("webdriver.chrome.driver", "/chromedriver/chromedriver");
              driver = new ChromeDriver();
              String env = System.getProperty("Environment");
              // 先判空再调用contains,避免空指针
              if(env != null && (env.contains("Prod") || env.contains("prod") || env.contains("PROD"))) {
                  driver.get(Prod_URL);
              }
      }
      

    方案二:保留Feature参数做降级

    如果你想保留Feature参数作为备选,可以先判断传入参数是否为空,再读取系统属性:

    public void launchPreflight(String env) {
            System.setProperty("webdriver.chrome.driver", "/chromedriver/chromedriver");
            driver = new ChromeDriver();
            // 如果Feature传入的参数为空,再读取系统属性
            if(env == null || env.isEmpty()) {
                env = System.getProperty("Environment");
            }
            // 必须先判空再调用contains
            if(env != null && (env.contains("Prod") || env.contains("prod") || env.contains("PROD"))) {
                driver.get(Prod_URL);
            }
    }
    

    不管选哪种方案,调用contains前一定要先判断env是否为null,这是解决当前错误的核心。


内容的提问来源于stack exchange,提问作者Ashutosh Das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:23:24