2011-12-08 12 views
5

Soy nuevo en la escena de la automatización de pruebas, así que discúlpeme si esta es una pregunta estúpida, pero Google me ha fallado esta vez. O al menos todo lo que he leído me ha confundido más.¿Hay un equivalente de testNG's @BeforeSuite en JUnit 4?

Estoy usando JUnit 4 y Selenium Webdriver dentro de Eclipse. Tengo varias pruebas que necesito ejecutar como suite y también de forma individual. Por el momento, estas pruebas funcionan bien cuando se ejecutan por su cuenta. Al comienzo de la prueba, se presenta un cuadro de entrada al probador/usuario que pregunta primero en qué servidor desea probar (esta es una variable de cadena que se convierte en parte de una URL) y con qué explorador desea probar. En el momento en que se ejecutan las pruebas en una suite, se le pregunta al usuario al comienzo de cada prueba, porque obviamente esto está codificado en cada uno de sus métodos @Before.

¿Cómo tomo estos valores una vez y los paso a cada uno de los métodos de prueba?

Entonces si server = "server1" y browser = "firefox" entonces firefox es el navegador que quiero que use el selenio y la URL que quiero que se abra es http://server1.blah.com/ para todos los siguientes métodos de prueba. La razón por la que he estado usando los métodos @Before separados es porque la URL requerida es ligeramente diferente para cada método de prueba. es decir, cada método prueba una página diferente, como server1.blah.com/something y server1.blah.com/somethingElse

Las pruebas funcionan bien, simplemente no quiero seguir ingresando los valores porque el número de pruebas los métodos eventualmente serán silenciosamente grandes.

También podría convertir mis pruebas a testNG si hay una forma más fácil de hacerlo en testNG. Pensé que la anotación @BeforeSuite podría funcionar, pero ahora no estoy seguro.

Cualquier sugerencias y críticas (el tipo constructivo) se aprecia mucho

Respuesta

0

Podría tener sentido para las pruebas de grupo de manera que el conjunto de pruebas tendrá el mismo código @Before método, por lo que tiene un conjunto de pruebas para cada uno por separado .

Otra opción podría ser utilizar la misma URL base para cada prueba, pero vaya a la página específica haciendo que el selenio haga clic hasta donde desee llevar a cabo la prueba.

1

Puede adaptar la solución para establecer una variable global para un conjunto en esta respuesta al JUnit 4 Test invocation.

Básicamente, extiende Suite para crear MySuite. Esto crea una variable/método estático al que se puede acceder a partir de tus pruebas. Luego, en sus pruebas, verifica el valor de esta variable. Si está configurado, usa el valor. Si no, entonces lo entiendes. Esto le permite ejecutar una única prueba y un conjunto de pruebas, pero solo le preguntará al usuario una vez.

Por lo tanto, su suite se verá así:

public class MySuite extends Suite { 
    public static String url; 

    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     MySuite.url = getUrlFromUser(); 
    } 
} 

Esto se usaría en su suite de este modo:

@RunWith(MySuite.class) 
@SuiteClasses({FooTest.class, BarTest.class, BazTest.class}); 

Luego, en sus clases de prueba, puede hacer algo en el @Before/@After, o mejor, mira TestRule, o si quieres comportamiento Antes y Después, mira ExternalResource. ExternalResource se ve así:

public static class FooTest { 
    private String url; 

    @Rule 
    public ExternalResource resource= new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      url = (MySuite.url != null) ? MySuite.url : getUrlFromUser(); 
     }; 

     @Override 
     protected void after() { 
      // if necessary 
     }; 
    }; 

    @Test 
    public void testFoo() { 
     // something which uses resource.url 
    } 
} 

Puede externalizar, por supuesto, la clase ExternalResource, y lo utilizan desde múltiples casos de prueba.

+0

Gracias Matthew, eso ayuda. Sin embargo, me temo que voy a tener que hacerte algunas preguntas terribles sobre novatos :(Primero la línea this(builder, klass, getAnnotatedClasses(klass)); no funciona porque getAnnotatedClasses (Clase ) no está visible. Segundo, no estoy seguro de dónde definir getUrlFromUser() .. ... Me doy cuenta de que puedo estar un poco sobre mi cabeza y le agradecería mucho su paciencia :) – user1088166

+0

Usted dijo en su pregunta 'Un cuadro de entrada se presenta al usuario' Esto sería getUrlFromUser, no lo hace realmente importa dónde está, pero en MySuite probablemente sería un buen lugar. En cuanto a esto (...) ¿qué versión de JUnit estás usando? –

+0

Ok, te estoy siguiendo ahora. Estoy usando JUnit 4. Esto puede no ser relevante, pero inicialmente creé los casos de prueba usando el IDE de selenio y luego los exporté como casos de prueba JUnit 4 (WebDriver) para trabajar con ellos en eclipse. – user1088166

1

Creo que la principal funcionalidad de TestNG que será útil aquí no es solo @BeforeSuite sino @DataProviders, lo que hace que sea trivial ejecutar la misma prueba con un conjunto diferente de valores (y no requiere el uso de estática , que siempre se convierten en una responsabilidad en el futuro).

También podría interesarle el soporte de scripting de TestNG, lo que hace que sea trivial pedirle al usuario alguna información antes de que comiencen las pruebas, here is an example of what you can do with BeanShell.

+0

buenos comentarios pero no responden la pregunta. –

0

Si usa @RunWith(Suite.class), puede agregar métodos estáticos con @BeforeClass (y @AfterClass), que se ejecutarán antes (y después) de toda la suite que defina. Ver this question.

Esto, por supuesto, no ayudará si se está refiriendo a todo el conjunto de clases encontradas dinámicamente, y no están usando Suite runner.