0

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?

enter image description here

@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
1
  • What results are you getting from the code you posted? Commented Jan 30, 2023 at 10:31

1 Answer 1

0

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.