Google Sheets API Integratie met Katalon Studio
Introductie
Bij geautomatiseerd testen wordt Katalon Studio erkend als een uitgebreid en robuust platform dat de integratie van verschillende services mogelijk maakt om testworkflows te verbeteren. Deze tutorial toont hoe je de Google Sheets API naadloos kunt integreren met Katalon Studio met behulp van een serviceaccount.
Deze integratie is bijzonder waardevol voor testers die:
- Testdata uit spreadsheets willen gebruiken
- Testresultaten naar Google Sheets willen schrijven
- Dynamische testcases willen creëren op basis van spreadsheet-inhoud
Vereisten
Voordat je begint, zorg ervoor dat je het volgende hebt:
Software Vereisten
- Google Cloud Account: Voor toegang tot de Google Sheets API
- Katalon Studio: Geïnstalleerd en ingesteld op je systeem
- Java Development Kit (JDK): Versie 8 of hoger
Benodigde Machtigingen
- Beheerderrechten in Google Cloud Console (of samenwerking met een beheerder)
- Toegang tot de Google Sheets die je wilt integreren
Stap-voor-stap Implementatie
Stap 1: Google Sheets API Inschakelen
-
Navigeer naar Google Cloud Console
- Ga naar Google Cloud Console
- Selecteer een bestaand project of maak een nieuw project aan
-
API Inschakelen
Google Cloud Console → API's & Services → Bibliotheek → Google Sheets API → Inschakelen
-
Serviceaccount Aanmaken
- Ga naar ‘API’s & Services’ → ‘Inloggegevens’
- Klik op ‘Inloggegevens maken’ → ‘Serviceaccount’
- Vul de serviceaccount details in
- Download het JSON-sleutelbestand
⚠️ Belangrijk: Bewaar het JSON-sleutelbestand veilig en deel het nooit openbaar.
Stap 2: Google Sheet Configureren
-
Sheet Delen
- Open je Google Sheet
- Klik op ‘Delen’ rechtsboven
- Voeg het e-mailadres van je serviceaccount toe
- Geef de juiste machtigingen (Lezer/Editor afhankelijk van je behoeften)
-
Sheet ID Verkrijgen
- Kopieer de Sheet ID uit de URL
- Format:
https://docs.google.com/spreadsheets/d/SHEET_ID_HIER/edit
Stap 3: Katalon Studio Project Configureren
3.1 Dependencies Toevoegen
Voeg de volgende dependencies toe aan je build.gradle
bestand:
dependencies {
compile 'com.google.apis:google-api-services-sheets:v4-rev581-1.25.0'
compile 'com.google.api-client:google-api-client:1.30.9'
compile 'com.google.oauth-client:google-oauth-client-jetty:1.30.6'
compile 'com.google.auth:google-auth-library-oauth2-http:0.20.0'
}
3.2 JSON Sleutelbestand Toevoegen
- Plaats het JSON-sleutelbestand in je Katalon project directory
- Voeg het toe aan
Include/data/
folder voor betere organisatie
Stap 4: Custom Keyword Implementeren
Maak een nieuw package com.katalon.keywords
en voeg de volgende klasse toe:
package com.katalon.keywords
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.JsonFactory
import com.google.api.client.json.jackson2.JacksonFactory
import com.google.api.services.sheets.v4.Sheets
import com.google.api.services.sheets.v4.SheetsScopes
import com.google.api.services.sheets.v4.model.ValueRange
import com.kms.katalon.core.annotation.Keyword
import java.io.FileInputStream
import java.io.IOException
import java.security.GeneralSecurityException
public class GoogleSheetsKeywords {
private static final String APPLICATION_NAME = "Katalon Studio Google Sheets Integration"
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance()
private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS)
/**
* Authorisatie met serviceaccount
*/
private static GoogleCredential getCredentials(String credentialsFilePath) throws IOException {
FileInputStream serviceAccountStream = new FileInputStream(credentialsFilePath)
GoogleCredential credential = GoogleCredential.fromStream(serviceAccountStream)
.createScoped(SCOPES)
return credential
}
/**
* Google Sheets service bouwen
*/
private static Sheets getSheetsService(String credentialsFilePath) throws IOException, GeneralSecurityException {
final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport()
GoogleCredential credential = getCredentials(credentialsFilePath)
return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build()
}
/**
* Data lezen uit Google Sheet
* @param credentialsFilePath - Pad naar JSON credentials bestand
* @param spreadsheetId - ID van de Google Sheet
* @param range - Range om te lezen (bijv. "Sheet1!A1:D10")
* @return List<List<Object>> - De gelezen data
*/
@Keyword
def readSheetData(String credentialsFilePath, String spreadsheetId, String range) {
try {
Sheets service = getSheetsService(credentialsFilePath)
ValueRange response = service.spreadsheets().values()
.get(spreadsheetId, range)
.execute()
List<List<Object>> values = response.getValues()
if (values == null || values.isEmpty()) {
println("Geen data gevonden.")
return []
} else {
println("Data succesvol gelezen: ${values.size()} rijen")
return values
}
} catch (Exception e) {
println("Fout bij lezen van Sheet data: ${e.getMessage()}")
throw e
}
}
/**
* Data schrijven naar Google Sheet
* @param credentialsFilePath - Pad naar JSON credentials bestand
* @param spreadsheetId - ID van de Google Sheet
* @param range - Range om naar te schrijven
* @param values - Data om te schrijven
*/
@Keyword
def writeSheetData(String credentialsFilePath, String spreadsheetId, String range, List<List<Object>> values) {
try {
Sheets service = getSheetsService(credentialsFilePath)
ValueRange body = new ValueRange()
.setValues(values)
service.spreadsheets().values()
.update(spreadsheetId, range, body)
.setValueInputOption("RAW")
.execute()
println("Data succesvol geschreven naar Sheet")
} catch (Exception e) {
println("Fout bij schrijven naar Sheet: ${e.getMessage()}")
throw e
}
}
/**
* Specifieke cel waarde ophalen
* @param credentialsFilePath - Pad naar JSON credentials bestand
* @param spreadsheetId - ID van de Google Sheet
* @param cellAddress - Cel adres (bijv. "A1")
* @return String - Cel waarde
*/
@Keyword
def getCellValue(String credentialsFilePath, String spreadsheetId, String cellAddress) {
try {
List<List<Object>> data = readSheetData(credentialsFilePath, spreadsheetId, cellAddress)
if (data && data.size() > 0 && data[0].size() > 0) {
return data[0][0].toString()
}
return ""
} catch (Exception e) {
println("Fout bij ophalen cel waarde: ${e.getMessage()}")
return ""
}
}
}
Stap 5: Test Case Implementatie
Maak een nieuwe test case en gebruik de custom keywords:
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable as GlobalVariable
// Configuratie
String credentialsPath = "Include/data/service-account-credentials.json"
String spreadsheetId = "1ABC123DEF456GHI789JKL_JOUW_SHEET_ID"
String testDataRange = "Sheet1!A2:D10"
// Test data lezen uit Google Sheet
def testData = CustomKeywords.'com.katalon.keywords.GoogleSheetsKeywords.readSheetData'(
credentialsPath,
spreadsheetId,
testDataRange
)
// Itereren door de test data
for (int i = 0; i < testData.size(); i++) {
def row = testData[i]
// Gebruik de data in je test
String username = row[0]?.toString() ?: ""
String password = row[1]?.toString() ?: ""
String expectedResult = row[2]?.toString() ?: ""
// Voer je test uit met deze data
WebUI.setText(findTestObject('Page_Login/input_username'), username)
WebUI.setText(findTestObject('Page_Login/input_password'), password)
WebUI.click(findTestObject('Page_Login/button_login'))
// Verificatie en resultaat terugschrijven naar sheet
boolean testPassed = WebUI.verifyTextPresent(expectedResult, false)
String result = testPassed ? "PASSED" : "FAILED"
// Resultaat terugschrijven (kolom D)
String resultRange = "Sheet1!D${i + 2}"
def resultData = [[result]]
CustomKeywords.'com.katalon.keywords.GoogleSheetsKeywords.writeSheetData'(
credentialsPath,
spreadsheetId,
resultRange,
resultData
)
}
Stap 6: Global Variables Configureren
Voor betere configuratie, voeg Global Variables toe:
- Ga naar
Profiles/default
- Voeg de volgende variabelen toe:
GOOGLE_CREDENTIALS_PATH
GOOGLE_SPREADSHEET_ID
TEST_DATA_RANGE
Praktische Tips en Best Practices
Foutafhandeling
@Keyword
def safeReadSheetData(String credentialsFilePath, String spreadsheetId, String range) {
try {
return readSheetData(credentialsFilePath, spreadsheetId, range)
} catch (Exception e) {
// Log de fout
WebUI.comment("Google Sheets API fout: ${e.getMessage()}")
// Fallback naar lokale testdata
return getLocalFallbackData()
}
}
Performance Optimalisatie
- Cache de Sheets service instance voor hergebruik
- Batch meerdere operaties samen
- Gebruik alleen de benodigde ranges
Beveiliging
- Bewaar credentials nooit in versiecontrole
- Gebruik omgevingsvariabelen voor gevoelige informatie
- Beperk serviceaccount machtigingen tot minimum vereiste
Troubleshooting
Veelvoorkomende Problemen
-
403 Forbidden Error
- Controleer of de Sheet gedeeld is met het serviceaccount
- Verificeer API machtigingen
-
FileNotFoundException
- Controleer het pad naar het credentials bestand
- Zorg ervoor dat het bestand in de juiste directory staat
-
Invalid Range
- Controleer de range syntax (bijv. “Sheet1!A1:D10”)
- Verifieer dat het sheet tab bestaat
Debug Tips
// Enable debug logging
System.setProperty("com.google.api.client.http.HttpTransport", "true")
Conclusie
Met deze integratie kun je:
- Dynamische testdata uit Google Sheets gebruiken
- Testresultaten automatisch rapporteren
- Gedeelde testdata beheren met je team
- Data-driven testing implementeren
Deze aanpak zorgt voor flexibele, onderhoudbare en collaboratieve test automation workflows.