Groovy中的数字格式异常

时间:2018-01-23 22:51:43

标签: json rest groovy soapui jsonslurper

我试图将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 个答案:

答案 0 :(得分:3)

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

  • 定义测试用例级别的自定义属性,例如EXPECTED_TAX_RATE,并将值提供为6.75
  • 在回复中,rate是字符串值。
  • 在这种特殊情况下,无需创建额外的Groovy Script测试步骤,只需检查/比较值,删除步骤。
  • 而是使用上面的代码为其余请求测试步骤添加Script Assertion
  • 但是,需要阅读响应的细微变化。

以下是完整的Script Assertion

//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

就像已经提到过的那样,可以在Script Assertion中阅读以下内容

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

现在 expectedPayment 需要转换为 actualPayment 的类型

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

答案 1 :(得分:0)

鉴于此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