当前位置: 首页 > 知识库问答 >
问题:

如何在java selenium中将失败测试数据传递给软断言

邵浩大
2023-03-14

我在json文件中有一个测试数据,如下所示-

{
    "alerts" : [
    {
        "alert_name" : "employee",
        "sql_query" : "select * from employee",
        "description" : "Query with Variables",
        "default_interval" : "10 minutes",
        "default_priority" : "Critical",
        "variables" : [{
                            "variable" : "failurereason",
                            "value" : "INVALID USER"
                            },
                            {
                            "variable" : "count",
                            "value" : "1"
                    }]
        },
    {
        "alert_name" : "employee2",
        "sql_query" : "select * from employee2",
        "description" : "Query with Variables",
        "default_interval" : "10 minutes",
        "default_priority" : "Critical",
        "variables" : [{
                            "variable" : "failurereason",
                            "value" : "INVALID USER"
                            },
                            {
                            "variable" : "count",
                            "value" : "1"
                    }]
        }

我在java selenium中有一个测试方法,它将遍历json,并用实际数据检查数据是否存在。下面是Java selenium方法。

public boolean createAlert(String jsonFile,String Host, String Port) {
        boolean success = true;
        String logStr = "Unable to create Alert";
        
        JSONObject readJsonFilePath = rjf.readJsonFilePath(jsonFile);
        JSONArray alertsJsonArray = readJsonFilePath.getJSONArray("alerts");
        
        System.out.println("+++++ Number of Test Cases to be run are : " + alertsJsonArray.length() + " +++++");
        
        for(int i = 0; i < alertsJsonArray.length(); i++)
        {
            JSONObject alertJsonObject = alertsJsonArray.getJSONObject(i);
            String description = alertJsonObject.getString("description");
            System.out.println("+++++++++++Test Case : " + i + " Running : " + description + " ++++++++++++++");
            
            String alert_name = alertJsonObject.getString("alert_name");
            String sql_query = alertJsonObject.getString("sql_query");
            String defaultInterval = alertJsonObject.getString("default_interval");
            String defaultPriority = alertJsonObject.getString("default_priority");
            
            if (
                    this.clickUponCreate(alert_name,sql_query) &&
                    this.setVariablesInVariableBar(alertJsonObject,"variables") &&
                    this.runQueryCreateAlertAndVerifyIsAlertCreated(alert_name, Host, Port, defaultInterval, defaultPriority))
            {   
                logStr = "Able to set the values ";
            }
            else {
                System.out.println(TEXT_RED +  alert_name + description + "Test Case : " + i + " Failed");
                success=false;
            }
          }
        System.out.println(logStr);
        return success;
    }

上面的代码循环了两次,因为json对象有两个测试数据,现在如果其中一个测试在最后失败,它只会提到测试失败,因为它是在else条件中添加的。

我使用了如下软断言-

softassert.assertTrue(page.createAlert(jsonFile,Host,Port),
                "test11.1: Verified combinations of Alerts");

我不知道json文件中的两个测试数据集中哪一个失败了。运行后,如果其中一个失败,它只会提到“验证的测试应该是真的,但它是假的”

假设我有100个测试数据,类似地,如何从json测试数据集中识别失败的测试数据。有办法吗?

共有1个答案

刘琨
2023-03-14

实现这一点有两种方法:

1) 使用软断言。

您可以在软断言中添加一条消息以识别哪个测试用例失败。根据代码,我可以看到您正在打印测试用例编号和描述。

  softassert.assertTrue(page.createAlert(jsonFile,Host,Port),
                "test11.1: Verified combinations of Alerts", 
                "Test Case : " + i + " Failed : " + description);

2) 正确的方法是使用dataprovider:通过使用dataprovider,您可以根据可用的测试数据执行测试方法,即使一个测试方法失败,也会执行另一个测试方法。因此,您的代码不会中断。

注意:请更改并更正代码

@DataProvider
    public Object[][] getJsonData(){
       return createAlert("","","");
    }


 @Test(dataProvider = "jsonData")
    public void testJson(String alert_name, String sql_query, String defaultInterval, String defaultPriority){
        //Add your logic here
    }



 public Object[][] createAlert(String jsonFile, String Host, String Port) {
        boolean success = true;
        String logStr = "Unable to create Alert";

        JSONObject readJsonFilePath = rjf.readJsonFilePath(jsonFile);
        JSONArray alertsJsonArray = readJsonFilePath.getJSONArray("alerts");


        System.out.println("+++++ Number of Test Cases to be run are : " + alertsJsonArray.length() + " +++++");

        Object[][] jsonData = new Object[alertsJsonArray.length()][4];

        for(int i = 0; i < alertsJsonArray.length(); i++)
        {
            JSONObject alertJsonObject = alertsJsonArray.getJSONObject(i);
            String description = alertJsonObject.getString("description");
            System.out.println("+++++++++++Test Case : " + i + " Running : " + description + " ++++++++++++++");

            String alert_name = alertJsonObject.getString("alert_name");
            String sql_query = alertJsonObject.getString("sql_query");
            String defaultInterval = alertJsonObject.getString("default_interval");
            String defaultPriority = alertJsonObject.getString("default_priority");

            jsonData[i][0] = alert_name;
            jsonData[i][1] = sql_query;
            jsonData[i][2] = defaultInterval;
            jsonData[i][3] = defaultPriority;

        }
        System.out.println(logStr);
        return jsonData;
    }
 类似资料:
  • 下面是TestNG框架中的一个示例断言方法。 下面是fail方法。 在TestNG中是否有一个内置的方法来执行软断言。如果没有,实现这一点的理想方式是什么。

  • 很新的反应。。。 我试图循环我的this.props.children,以便向他们传递一个在我的父项中定义的字符串。。。在没有在render方法中定义这些子对象的情况下,这是可能的吗? OwnRenderer应该将道具字符串传递给它的所有子级。。。OwnRenderer不知道要渲染哪个孩子,因此无法通过“”直接传递道具。。。 我试着绕过孩子们直接传递那根绳子,但不幸的是,这不起作用。 不知怎的,它

  • 问题内容: 假设我有两个输入框,分别具有对应的ng-model作为fname和lname。如果我将http请求称为: 它会调用URL: 我在后端(python)遇到的错误是: 这些参数不以字符串形式发送吗?如果没有,该如何解决? 问题答案: 这是您的操作方式: Angular负责对参数进行编码。 Maxim Shoustin的答案不起作用(这不是有效的JavaScript文字),而JeyTheva

  • 我目前正在使用环境变量向负载测试传递自定义参数。例如,我的测试类如下所示: 然后,我将使用以下工具运行测试: 有没有更多的方式可以将自定义参数传递给命令行应用程序?

  • 我目前在一个项目中使用TestNG启动Selenium测试套件,并处理maven项目中所有结果的日志记录,该项目在Jenkins的工作中每晚运行。 当前,当一个测试失败了一个断言时,TestNG会杀死我们正在运行的所有东西,它不仅会使当前测试失败,还会继续运行套件中的其他测试。我不明白为什么TestNG不只是使当前的测试失败,然后启动剩余的尚未运行的测试。这使得TestNG在这一点上成为一个无用的

  • 我有三节课 1.菜单活动 2.LocationUpdateService 3.多重标记器 1.菜单活动 2、LocationUpdateService:(这是服务类) 3、多重标记(活动) 我的问题是:当我打开我的菜单活动我的Toast消息打印发送数据到广播接收器,然后点击按钮我调用MultipleMarker。我无法从服务中获取值。。。但当我按下后退按钮时,我重定向到MenuActivity,此