命令行设置系统属性后无法在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就会触发空指针错误。系统属性读取失败的排查点
- 检查Maven命令的参数格式:
-DEnvironment="Prod"本身没问题,但要注意shell的引号转义问题,比如有些终端下引号可能被吃掉,导致参数没传进去。可以在代码里加一行System.out.println(System.getProperty("Environment")),确认是否能读到值。 - 检查测试运行器:如果用了JUnit的
@CucumberOptions或者其他运行器,确保它没有覆盖或屏蔽Environment这个系统属性。
- 检查Maven命令的参数格式:
具体修复方案
方案一:直接用系统属性(推荐)
既然命令行已经传了系统属性,就不需要从Feature文件传参了:
- 修改Feature步骤:
Given User launch preflight - 修改步骤定义:
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,这是解决当前错误的核心。- 修改Feature步骤:
内容的提问来源于stack exchange,提问作者Ashutosh Das
相关产品推荐
相关产品推荐

