To run my Selenium/Cucumber java project, I need to pass some VM arguments, variables, properties path etc... now easiest way is to pass it in Eclipse run configuration under "VM arguments" tab. I need to give path of Log4j2.xml, sqlJdbc driver, any UserID etc.
Now, if i put all this in a properties file and then run the "TestRunner', then how can i make sure properties are loaded before the Features run. I get NullPointerException.
Can i put this in a static block? THis way will it get initialized before any TestNG feature runs?
@CucumberOptions(glue = { "stepDefinitions" }, features = {
"src/test/resources/features/CreateUserProfile.feature" }, plugin = { "pretty",
"json:test-output/JsonReport.json", "html:test-output/HTMLReport.html",
"com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:", })
public class TestRunner {
public TestNGCucumberRunner testNGCucumberRunner;
@BeforeClass(alwaysRun = true)
public void setUpClass() {
if (testNGCucumberRunner == null) {
testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
}
}
@Test(groups = "cucumber scenarios", description = "Runs Cucumber Scenarios", dataProvider = "scenarios")
public void scenario(PickleWrapper pickleEvent, FeatureWrapper cucumberFeature) throws Throwable {
testNGCucumberRunner.runScenario(pickleEvent.getPickle());
}
@DataProvider
public Object[][] scenarios() {
if (testNGCucumberRunner == null) {
testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
}
return testNGCucumberRunner.provideScenarios();
}
@AfterClass(alwaysRun = true)
public void tearDownClass() {
testNGCucumberRunner.finish();
}
static {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
System.setProperty("current.date", dateFormat.format(new Date()));
String propertyFilePath = "C:\\EclipseWorkspace\\Automation\\src\\main\\resources\\config.properties";
BufferedReader reader;
try {
reader = new BufferedReader(new FileReader(propertyFilePath));
Properties properties = new Properties();
try {
properties.load(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("Config.properties not found at " + propertyFilePath);
}
}
}
UPDATE:
I get this error ...i have loaded the properties file in the TestRunner.java file, also loaded in the BaseTest.java class where driver is initialized. Still i get this error. Please help. I don't want to use eclipse VM arguments and want my properties to be loaded from the script only.
java.lang.NullPointerException: Cannot invoke "String.equalsIgnoreCase(String)" because the return value of "java.lang.System.getProperty(String)" is null
-
What results are you getting from the code you posted?João Farias– João Farias2023年01月30日 10:31:10 +00:00Commented Jan 30, 2023 at 10:31
1 Answer 1
Solution :
- Snippet to load config.properties
Properties prop=new Properties();
FileInputStream ips = new FileInputStream("home/username/ProjectName/src/config.properties");
prop.load(ips);
- Ensure .properties are getting loaded before features run:
- Basically you can have multiple implementations to achieve this
- On successful driver object creation, you can create and load the prop object
- Good solution to use try..catch blocks for all the initialisation