Generación de cadena aleatoria con un patrón

Menos mal que esto es en español y me puedo explicar mejor. Los foros en general están en ingles y me temo que no me entienden. Soy Ingeniero de pruebas y estoy utilizando Selenium ide para automatizar pruebas. Mi conocimiento de programación en general es básico aunque intento ir mejorando.
En muchos casos el escenario es que he de introducir una cadena con un formato dado y además no se puede repetir. Cada vez que lanzo la prueba he de cambiar el valor y volverlo a lanzar. Eso es muy pesado cuando se han de lanzar muchas pruebas automáticas. Me interesaría que se generara un valor aleatorio con el formato correcto y que se lanzara la prueba sin necesidad de otros cambios.
Lo que quiero es que, si la cadena que quiero introducir es del tipo XXXNNNNN, que son tres caracteres alfabéticos (en mayúsculas) y cinco números, esto lo almacene en una variable y después Selenium, al lanzar la prueba, la cargue. Eso creo que es una expresión regular del tipo /^[A-Z]{3}\d{5}$/ pero de ahí ha hacerla aleatoria se me escapa de mis conocimientos.
Incluyo aquí el script exportado desde selenium a junit (espero que algún experto conozca selenium IDE para que sepa de lo que hablo :-P ).
package com.example.tests;
import com.thoughtworks.selenium.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.regex.Pattern;
public class crea_agente extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://daisy-w2003.hi.inet/CustomerSupport");
selenium.start();
}
@Test
public void testCrea_agente() throws Exception {
selenium.open("/CustomerSupport/Account");
selenium.click("//div[@id='content']/ul/li[2]/a");
selenium.click("link=Crear agente");
selenium.type("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[1]/input", "AGE10000");
selenium.type("Name", "Agente Luis");
selenium.type("Description", "Agente Luis");
selenium.type("Password", "TEst%%00");
selenium.type("PasswordConfirm", "TEst%%00");
selenium.click("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[8]/a/span[2]");
selenium.click("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[10]/span/a[1]/span[2]");
verifyTrue(selenium.isElementPresent("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/div[1]/p"));
}
@After
public void tearDown() throws Exception {
selenium.stop();
}
}

1 Respuesta

Respuesta
1
Podrías crear una función que te retorne una cadena aleatoria con el formato que necesitas en tiempo de ejecución, así para cada nueva carga del programa tendrías un valor nuevo, sin tocar nada más.
Por ejemplo:
String getCadenaAleatoria (int longitud){
String cadenaAleatoria = "";
long ms = new java.util.GregorianCalendar().getTimeInMilis();
Random r = new Random(ms);
int i = 0;
while ( i < longitud){
char c = (char)r.nextInt(255);
if ( (c >= '0' && c <=9) || (c >='A' && c <='Z') ){
cadenaAleatoria += c;
i ++;
}
}
return cadenaAleatoria;
}
Luego en tu código:
selenium.click("link=Crear agente");
selenium.type("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[1]/input", "AGE10000");
selenium.type("Name", "Agente Luis");
Reemplazas el valor constante "AGE10000" por la función que has creado,
selenium.type("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[1]/input", getCadenaAleatoria(8));
Sólo tendrás que modificar getCadenaAleatoria para que retorne la cadena en el formato concreto que tu necesitas CCCNNNNN.
Hola:
Menos mal que esto es en español y me puedo explicar mejor. Los foros en general están en ingles y me temo que no me entienden. Soy Ingeniero de pruebas y estoy utilizando Selenium ide para automatizar pruebas. Mi conocimiento de programación en general es básico aunque intento ir mejorando.
En muchos casos el escenario es que he de introducir una cadena con un formato dado y además no se puede repetir. Cada vez que lanzo la prueba he de cambiar el valor y volverlo a lanzar. Eso es muy pesado cuando se han de lanzar muchas pruebas automáticas. Me interesaría que se generara un valor aleatorio con el formato correcto y que se lanzara la prueba sin necesidad de otros cambios.
Lo que quiero es que, si la cadena que quiero introducir es del tipo XXXNNNNN, que son tres caracteres alfabéticos (en mayúsculas) y cinco números, esto lo almacene en una variable y después Selenium, al lanzar la prueba, la cargue. Eso creo que es una expresión regular del tipo /^[A-Z]{3}\d{5}$/ pero de ahí ha hacerla aleatoria se me escapa de mis conocimientos.
Incluyo aquí el script exportado desde selenium a junit (espero que algún experto conozca selenium IDE para que sepa de lo que hablo :-P ).
package com.example.tests;
import com.thoughtworks.selenium.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.regex.Pattern;
public class crea_agente extends SeleneseTestCase {
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://daisy-w2003.hi.inet/CustomerSupport");
selenium.start();
}
@Test
public void testCrea_agente() throws Exception {
selenium.open("/CustomerSupport/Account");
selenium.click("//div[@id='content']/ul/li[2]/a");
selenium.click("link=Crear agente");
selenium.type("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[1]/input", "AGE10000");
selenium.type("Name", "Agente Luis");
selenium.type("Description", "Agente Luis");
selenium.type("Password", "TEst%%00");
selenium.type("PasswordConfirm", "TEst%%00");
selenium.click("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[8]/a/span[2]");
selenium.click("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/form/div[10]/span/a[1]/span[2]");
verifyTrue(selenium.isElementPresent("//div[@id='content']/ul/li[2]/ul/li[3]/div/div/div[2]/div[1]/p"));
}
@After
public void tearDown() throws Exception {
selenium.stop();
}
}
Gracias
Ok. Gracias.
Al final, tras muchos esfuerzos (para alguien con poco callo de programador como yo) conseguí que se generara la cadena. No obstante me viene bien para alternativa
Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas