代码之家  ›  专栏  ›  技术社区  ›  Srinivasan Ramu

Groovy中的数字格式异常

  •  1
  • Srinivasan Ramu  · 技术社区  · 8 年前

    我试图将6.75的增值税税率与我的预期值6.75进行比较,这是字符串格式。我编写了以下几行Groovy代码来实现这一点,但我遇到了数字格式异常,我无法找出问题所在

    Groovy代码

    def jsonSlurper = new JsonSlurper()
    def parsedResponseJson=jsonSlurper.parseText(context.expand('${StandardFinance#Response}'))
    def actualSalesTaxRate = parsedResponseJson.CustomerQuoteFinanceResponse.StandardFinanceResponse.Responses[0].StandardPaymentEngineFinanceResponse.paymentWithTaxes.financeItemizedTaxes.salesTax.taxParameters.rate
    def actualSalesTaxRate = parsedResponseJson.CustomerQuoteFinanceResponse.StandardFinanceResponse.Responses[0].StandardPaymentEngineFinanceResponse.paymentWithTaxes.financeItemizedTaxes.salesTax.taxParameters.rate
    log.info actualSalesTaxRate.size()
    actualSalesTaxRate = Float.parseFloat(actualSalesTaxRate)
    def expectedSalesTaxRate = "6.75"
    log.info expectedSalesTaxRate.size()
    expectedSalesTaxRate = Float.parseFloat(expectedSalesTaxRate)
    assert expectedSalesTaxRate.toString() == actualSalesTaxRate.toString(),"FAIL --- Sales Tax Rate is different"
    

    JSON响应

    {
    "CustomerQuoteFinanceResponse": {
        "StandardFinanceResponse": {
            "Responses": [{
                "StandardPaymentEngineFinanceResponse": {
                    "class": ".APRNonCashCustomerQuote",
                    "RequestID": "1",
                    "term": "48",
                    "financeSourceId": "F000CE",
                    "paymentWithTaxes": {
                        "class": ".FinancePaymentWithTaxes",
                        "amountFinanced": "34523.48",
                        "monthlyPayment": "782.60",
                        "monthlyPaymentWithoutDealerAddOns": 782.6,
                        "financeItemizedTaxes": {
                            "salesTax": {
                                "taxParameters": {
                                    "rate": "6.75"
                                },
                                "salesTaxAmount": "2322.61"
                            }
                        }
                    }
                }
            }]
        }
    }
    }
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Rao CrashOverload    8 年前

    您不必将其转换为数字,因为响应中的值是字符串。

    • 定义测试用例级自定义属性,例如 EXPECTED_TAX_RATE 并提供以下值: 6.75 .
    • 在回应中 rate 是字符串值。
    • 在这种特殊情况下,不需要创建额外的Groovy脚本测试步骤,只需检查/比较值,即可删除步骤。
    • 而是添加 Script Assertion 对于rest请求,使用上述代码测试步骤本身。
    • 但是,需要读取响应,这是一个很小的变化。

    这是完整的 脚本断言

    //Check the response is received
    assert context.response, 'Response is empty or null'
    
    //Read test case property for expected value as string; this way there is no need to edit the assertion; just change the property value
    def expectedTaxRate = context.expand('${#TestCase#EXPECTED_TAX_RATE}')
    
    def json = new groovy.json.JsonSlurper().parseText(context.response)
    
    def actualTaxRate = json.CustomerQuoteFinanceResponse.StandardFinanceResponse.Responses[0].StandardPaymentEngineFinanceResponse.paymentWithTaxes.financeItemizedTaxes.salesTax.taxParameters.rate
    log.info "Actual tax rate $actualSalesTaxRate"
    
    //Now compare expected and actual
    assert actualTaxRate == expectedTaxRate, 'Both tax rates are not matching'
    

    您可能会遇到诸如“关于字符串值的问题。如何与数字进行比较。例如 monthlyPaymentWithoutDealerAddOns 具有数字而不是字符串。如何应对?"

    当测试用例级自定义属性定义为 EXPECTED_MONTHLY_PATYMENT 和值为 782.6 .

    如上所述,可以在 脚本断言 如下所示

    def expectedMonthlyPayment = context.expand('${#TestCase#EXPECTED_MONTHLY_PATYMENT}') //but this is string
    

    您可以将实际值读取为:

    def actualPayment = json.CustomerQuoteFinanceResponse.StandardFinanceResponse.Responses[0].StandardPaymentEngineFinanceResponse.paymentWithTaxes.monthlyPaymentWithoutDealerAddOns
    log.info actualPayment.class.name //this shows the data type
    

    现在 预期付款 需要转换为 实际支付额 的类型

    def actualPayment = json.CustomerQuoteFinanceResponse.StandardFinanceResponse.Responses[0].StandardPaymentEngineFinanceResponse.paymentWithTaxes.monthlyPaymentWithoutDealerAddOns
    log.info actualPayment.class.name //this shows the data type
    def expectedPayment = context.expand('${#TestCase#EXPECTED_MONTHLY_PATYMENT}') as BigDecimal
    assert actualPayment == actualPayment
    
        2
  •  0
  •   Michael Easter    8 年前

    给定此JSON(与提供的完整JSON类似,但具有结束语法):

    def s = '''
    {"CustomerQuoteFinanceResponse": {"StandardFinanceResponse": {
       "Responses": [   {   
          "StandardPaymentEngineFinanceResponse":       {   
             "class": ".APRNonCashCustomerQuote",
             "RequestID": "1",
             "term": "48",
             "financeSourceId": "F000CE",
             "paymentWithTaxes":          {   
                "class": ".FinancePaymentWithTaxes",
                "amountFinanced": "34523.48",
                "monthlyPayment": "782.60",
                "monthlyPaymentWithoutDealerAddOns": 782.6,
                "financeItemizedTaxes":             {   
                   "salesTax":                {   
                      "taxParameters": {"rate": "6.75"},
                          "salesTaxAmount": "2322.61"
    }}}}}]}}}
    '''
    

    考虑以下代码:

    def jsonSlurper = new groovy.json.JsonSlurper()
    def json = jsonSlurper.parseText(s)
    def response = json.CustomerQuoteFinanceResponse
                       .StandardFinanceResponse
                       .Responses[0]
    
    assert 6.75 == response.StandardPaymentEngineFinanceResponse
                           .paymentWithTaxes
                           .financeItemizedTaxes
                           .salesTax
                           .taxParameters
                           .rate as Float