Сравнение двух таблиц с использованием скрипта groovy в soapui - PullRequest
1 голос
/ 12 февраля 2020

Мне нужно сравнить значения 2 таблиц в SQL Сервер. Я создал сценарий, но созданный сценарий сравнивает только всю таблицу как одну. Мне нужно было сравнить каждую строку из 2 таблиц. Вот мой сценарий, который я сделал

import groovy.sql.Sql
import java.sql.ResultSet
import com.eviware.soapui.support.GroovyUtils
import groovy.sql.DataSet

def sql = Sql.newInstance("jdbc:sqlserver://MSSQLSERVER01:1433",
            "User", "password", "com.microsoft.sqlserver.jdbc.SQLServerDriver")

resultsA = sql.eachRow("SELECT * FROM Bikestores.production.brands"){
temp1=it.toRowResult().values().join(", ") 
}
resultsB = sql.eachRow("SELECT * FROM Bikestores.dbo.sample"){
temp2=it.toRowResult().values().join(", ") 
}

while(temp1 != null && temp2 != null){

brandA = temp1
brandB = temp2

if(brandA==brandB){
    log.info "True"
    break
}

else{
   log.info "False"
   break
} 
} 
sql.close()

Результат - False, так как есть разница в значениях. Мне нужно сравнить каждую строку, как будто я получу 9 результатов, так как у меня 9 строк. Если у вас есть лучшие сценарии, пожалуйста, дайте мне знать. Спасибо.

Редактировать:

Sample data 

Table 1

id|name | check  
1  | abc   | yes  
2  | def   | yes  
3  | ghi  | yes  
4  | jkl  | yes  

Table 2  

id|name | check  
1  | abc   | yes  
2  | def   | yes  
3  | pqr  | yes  
4  | mno  | yes  


Expected Result  
[table1_name][table2_name]: true  
[table1_name][table2_name]: true  
[table1_name][table2_name]: false  
[table1_name][table2_name]: false  

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Несколько прямой путь:

...

List<String> tableA = sql.rows("SELECT * FROM Bikestores.production.brands")*.join(',')

sql.rows("SELECT brand_id FROM Bikestores.dbo.sample")*.join(',').each{
    log.info "$it equals -> ${tableA.contains( it )}"
}

0 голосов
/ 12 февраля 2020

Мои мысли: - Правильный и внушительный способ - это фильтрация по sql самому запросу, например select * from table1,table2 where field_1 == field_2. вам не нужны внешние вычисления.

Или если вы действительно хотите сделать это с помощью кода. пожалуйста, попробуйте предоставить пример данных таблицы и ожидаемый формат вывода только тогда мы можем помочь вам.

Ответ: Ваш код не собирает результаты, он просто заменяет последнюю строку eachRow(). Это модифицированный код:

temp1 = []
temp2 = []
resultsA = sql.eachRow("SELECT id FROM Bikestores.production.brands"){
temp1.append(it[0])
}
resultsB = sql.eachRow("SELECT brand_id FROM Bikestores.dbo.sample"){
temp2.append(it[0]) // If u having one column why u getting values list
}

temp1.each{ brandA ->
  temp2.each{ brandB ->
      if(brandA==brandB){
         log.info "$brandA : $brandB : True"          
       }
       else{
         log.info "$brandA : $brandB : False"
       } 
} 
sql.close()

Примечание:

  • Кажется, первый запрос select * from неверен. Это обеспечит все значения столбца. (ru знает об этом?)
  • Я не знаю, почему вы объединяете все значения в строке, используя .values().join(", "), когда вы собираетесь сравнивать с brand_id. Если я правильно укажу brands таблица должна иметь столбец id (интуитивно понятный).
  • Я думаю, вы не уверены, что вы получаете. Я надеюсь, что эти заметки прояснят и вдохновят вас задать лучший вопрос.

Обновление 1:

После просмотра образца, я думаю, это то, что вы ожидаете ....

def getResult(query, sql) // method changed
{
    temp = []
    sql.eachRow(query){
        temp.add(it.toRowResult()) // changed
    }
    temp    
}


resultsA = getResult("SELECT id, name, check FROM Bikestores.production.brands", sql)
resultsB = getResult("SELECT id, name, check FROM Bikestores.dbo.sample", sql)

resultsA.each{ brandA ->
  resultsB.each{ brandB ->
        if (brandA.id.trim() == brandB.id.trim()) // condition only for id match
         log.info "[${brandA.name}][${brandB.name}] : ${brandA.name == brandB.name}"                 
} 
sql.close()
...