slogan3

Maak Appium Testscripts voor Lokalisatietests van Mobiele Apps

description

Helpt ervoor te zorgen dat je mobiele app correct functioneert in verschillende talen en regio's door lokalisatietests te automatiseren met Appium. Deze prompt richt zich op een niche die nog niet is behandeld en verbetert de kwaliteit van internationalisatie, wat de gebruikerservaring verbetert en lokalisatiefouten vermindert.

prompt

Help me met het maken van Appium testscripts gericht op lokalisatietests voor mijn mobiele app. Mobiel platform: <voer je mobiele platform in zoals iOS of Android>. Talen en regio's om te testen: <noem de doel talen of regio's ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht en voorbeeldcode om je te helpen bij het opzetten van lokalisatietests voor je Android-app met Appium, Java en TestNG: 1. **Voorbereiding:** - Zorg dat je de juiste taal- en regio-instellingen op je emulator of apparaat kunt configureren. - Voeg testen toe die de taal wijzigen en controleren of de UI-teksten, datum- en getalformaten correct worden weergegeven. 2. **Taal- en regio-instellingen aanpassen:** Je kunt de taal en regio instellen via de capabilities of door de app te starten met bepaalde intent-parameters, afhankelijk van je app. Vaak is het eenvoudiger om de taal/regio te wijzigen via de emulator of apparaatinstellingen vóór het testen. 3. **Automatisch taal instellen:** Je kunt dit doen door tijdens het opstarten van de emulator of via ADB-commando's de taal te wijzigen. 4. **Voorbeeld TestNG-klasse:** ```java import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.remote.MobileCapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.Assert; import org.testng.annotations.*; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class Lokalisatietest { private AndroidDriver<MobileElement> driver; @BeforeClass @Parameters({"language", "region"}) public void setUp(String language, String region) throws Exception { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android"); caps.setCapability(MobileCapabilityType.DEVICE_NAME, "emulator-5554"); // Voeg app-specific capabilities toe caps.setCapability(MobileCapabilityType.APP, "/pad/naar/je/app.apk"); // Stel taal/regio in via capabilities (optioneel, afhankelijk van app ondersteuning) // caps.setCapability("locale", language); // caps.setCapability("language", region); driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), caps); // Alternatief: wijzig taal/regio via ADB voordat test start } @DataProvider(name = "lokaliseerData") public Object[][] lokaliseerData() { return new Object[][] { {"fr", "FR", "Bonjour", "01/01/2024", 1234.56}, {"de", "DE", "Hallo", "01.01.2024", 1234.56}, {"it", "IT", "Ciao", "01/01/2024", 1234.56} }; } @Test(dataProvider = "lokaliseerData") public void testLokalisatie(String languageCode, String regionCode, String expectedText, String expectedDateFormat, double expectedNumber) { // Hier zou je de taal/regio kunnen instellen via ADB of app-instellingen // Voorbeeld: controle UI tekst MobileElement tekstElement = driver.findElementById("com.jouwapp:id/tekst"); String actualText = tekstElement.getText(); Assert.assertEquals(actualText, expectedText, "UI tekst klopt niet voor taal: " + languageCode); // Controle datumformaat String datumString = driver.findElementById("com.jouwapp:id/datum").getText(); Assert.assertTrue(isCorrectDateFormat(datumString, expectedDateFormat), "Datum formaat klopt niet voor taal: " + languageCode); // Controle getalformaat String getalString = driver.findElementById("com.jouwapp:id/getal").getText(); Assert.assertTrue(isCorrectNumberFormat(getalString, languageCode), "Getal formaat klopt niet voor taal: " + languageCode); } private boolean isCorrectDateFormat(String dateStr, String expectedFormat) { try { SimpleDateFormat sdf = new SimpleDateFormat(expectedFormat, Locale.forLanguageTag(expectedFormat)); sdf.setLenient(false); sdf.parse(dateStr); return true; } catch (Exception e) { return false; } } private boolean isCorrectNumberFormat(String numberStr, String languageCode) { // Implementatie afhankelijk van het getalformaat per taal // Bijvoorbeeld, controle op scheidingstekens, decimale punt vs komma if (languageCode.equals("de") || languageCode.equals("de-DE")) { return numberStr.matches("\\d{1,3}(\\.\\d{3})*\\,\\d{2}"); } else if (languageCode.equals("fr") || languageCode.equals("fr-FR")) { return numberStr.matches("\\d{1,3}( \\d{3})*\\,\\d{2}"); } else if (languageCode.equals("it") || languageCode.equals("it-IT")) { return numberStr.matches("\\d{1,3}(\\.\\d{3})*\\,\\d{2}"); } return false; } @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } } } ``` **Belangrijke punten:** - Pas de element-ID's aan naar die van jouw app. - Je kunt de taal/regio instellen door gebruik te maken van ADB-commando’s vooraf, bijvoorbeeld: ``` adb shell am broadcast -a com.android.intent.action.SET_LOCALE --es locale "fr-FR" ``` - Alternatief kun je tijdens het starten van de emulator de taal/regio instellen via commandoregel of via emulatorinstellingen. - Voor uitgebreide datum- en getalformaten kun je native Java i18n functionaliteit gebruiken en vergelijken. Wil je dat ik je help met specifieke ADB-commando's of extra functionaliteit?
provider: deepseek
model: deepseek-chat
Hier is een uitgebreide handleiding voor het maken van Appium testscripts voor lokalisatietests op Android: ## 1. Basis Test Setup ```java import io.appium.java_client.android.AndroidDriver; import io.appium.java_client.android.options.UiAutomator2Options; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.time.Duration; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class LocalizationTest { private AndroidDriver driver; private WebDriverWait wait; @BeforeClass public void setUp() { UiAutomator2Options options = new UiAutomator2Options() .setDeviceName("uw_device_naam") .setPlatformVersion("uw_android_versie") .setAppPackage("uw.app.package") .setAppActivity("uw.MainActivity"); driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), options); wait = new WebDriverWait(driver, Duration.ofSeconds(10)); } } ``` ## 2. Lokalisatie Test Data ```java public class LocalizationTestData { public static Object[][] getLocalizationTestData() { return new Object[][] { // {taal, land, verwachteTekstKey, verwachteTekst, datumFormaat, getalFormaat} {"fr", "FR", "welcome_message", "Bienvenue", "dd/MM/yyyy", "1 234,56"}, {"de", "DE", "welcome_message", "Willkommen", "dd.MM.yyyy", "1.234,56"}, {"it", "IT", "welcome_message", "Benvenuto", "dd/MM/yyyy", "1.234,56"} }; } } ``` ## 3. UI Tekst Vertaling Tests ```java @Test(dataProvider = "localizationData") public void testUITextTranslations(String taal, String land, String elementId, String verwachteTekst, String datumFormaat, String getalFormaat) { // Stel device taal en regio in setDeviceLanguage(taal, land); // Herstart app voor lokalisatie wijzigingen driver.terminateApp("uw.app.package"); driver.activateApp("uw.app.package"); // Wacht op element en verifieer tekst WebElement element = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id(elementId)) ); String actueleTekst = element.getText(); Assert.assertEquals(actueleTekst, verwachteTekst, "Tekst komt niet overeen voor " + taal + ": verwacht '" + verwachteTekst + "', kreeg '" + actueleTekst + "'"); } private void setDeviceLanguage(String taal, String land) { Map<String, Object> args = new HashMap<>(); args.put("language", taal); args.put("country", land); driver.executeScript("mobile: shell", args); } ``` ## 4. Datum Formaat Tests ```java @Test(dataProvider = "localizationData") public void testDateFormat(String taal, String land, String elementId, String verwachteTekst, String datumFormaat, String getalFormaat) { setDeviceLanguage(taal, land); driver.terminateApp("uw.app.package"); driver.activateApp("uw.app.package"); // Zoek datum element (pas selector aan op uw app) WebElement datumElement = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("datum_veld")) ); String actueleDatum = datumElement.getText(); verifyDateFormat(actueleDatum, datumFormaat, taal); } private void verifyDateFormat(String datum, String verwachtFormaat, String taal) { try { DateTimeFormatter formatter; switch(taal) { case "fr": case "it": formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); break; case "de": formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); break; default: formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); } LocalDate parsedDate = LocalDate.parse(datum, formatter); Assert.assertTrue(true, "Datum formaat correct voor " + taal); } catch (Exception e) { Assert.fail("Ongeldig datum formaat voor " + taal + ": " + datum); } } ``` ## 5. Getal Formaat Tests ```java @Test(dataProvider = "localizationData") public void testNumberFormat(String taal, String land, String elementId, String verwachteTekst, String datumFormaat, String getalFormaat) { setDeviceLanguage(taal, land); driver.terminateApp("uw.app.package"); driver.activateApp("uw.app.package"); WebElement getalElement = wait.until( ExpectedConditions.visibilityOfElementLocated(By.id("getal_veld")) ); String actueelGetal = getalElement.getText(); verifyNumberFormat(actueelGetal, taal); } private void verifyNumberFormat(String getal, String taal) { switch(taal) { case "fr": // Frans: 1 234,56 Assert.assertTrue(getal.matches("^[0-9]{1,3}( [0-9]{3})*,[0-9]+$"), "Ongeldig getal formaat voor Frans: " + getal); break; case "de": // Duits: 1.234,56 Assert.assertTrue(getal.matches("^[0-9]{1,3}(\\.[0-9]{3})*,[0-9]+$"), "Ongeldig getal formaat voor Duits: " + getal); break; case "it": // Italiaans: 1.234,56 Assert.assertTrue(getal.matches("^[0-9]{1,3}(\\.[0-9]{3})*,[0-9]+$"), "Ongeldig getal formaat voor Italiaans: " + getal); break; } } ``` ## 6. DataProvider Configuratie ```java @DataProvider(name = "localizationData") public Object[][] provideLocalizationData() { return new Object[][] { {"fr", "FR", "welcome_text", "Bienvenue", "dd/MM/yyyy", "1 234,56"}, {"fr", "FR", "login_button", "Connexion", "dd/MM/yyyy", "1 234,56"}, {"fr", "FR", "settings_title", "Paramètres", "dd/MM/yyyy", "1 234,56"}, {"de", "DE", "welcome_text", "Willkommen", "dd.MM.yyyy", "1.234,56"}, {"de", "DE", "login_button", "Anmelden", "dd.MM.yyyy", "1.234,56"}, {"de", "DE", "settings_title", "Einstellungen", "dd.MM.yyyy", "1.234,56"}, {"it", "IT", "welcome_text", "Benvenuto", "dd/MM/yyyy", "1.234,56"}, {"it", "IT", "login_button", "Accesso", "dd/MM/yyyy", "1.234,56"}, {"it", "IT", "settings_title", "Impostazioni", "dd/MM/yyyy", "1.234,56"} }; } ``` ## 7. Test Suite Configuratie ```java @AfterClass public void tearDown() { if (driver != null) { driver.quit(); } } // Hulpmethode voor het maken van screenshots per taal private void takeScreenshot(String testName, String taal) { File screenshot = driver.getScreenshotAs(OutputType.FILE); try { Files.copy(screenshot.toPath(), new File("screenshots/" + testName + "_" + taal + ".png").toPath()); } catch (IOException e) { e.printStackTrace(); } } ``` ## Belangrijke Opmerkingen: 1. **Device Language Instellen**: Mogelijk moet u ADB commands gebruiken voor taalwijziging 2. **Element Locators**: Pas de element IDs aan op uw app structuur 3. **App Herstarten**: Cruciaal voor het activeren van lokalisatiewijzigingen 4. **Test Data**: Voeg alle relevante UI-elementen toe aan de DataProvider 5. **Screenshots**: Maak screenshots voor visuele verificatie ## ADB Commands voor Taalwijziging: ```bash # Frans adb shell "setprop persist.sys.language fr; setprop persist.sys.country FR" # Duits adb shell "setprop persist.sys.language de; setprop persist.sys.country DE" # Italiaans adb shell "setprop persist.sys.language it; setprop persist.sys.country IT" # Device herstarten na taalwijziging adb reboot ``` Deze setup test systematisch alle drie de talen en verifieert zowel tekstvertalingen als datum/getal formaten volgens de lokale conventies.
error: Generation failed [deepseek] prompt_id=4988 locale=pt err=DeepSeek connection/timeout