Transportador - Objetos

Este capítulo trata en detalle sobre los objetos en Transportador.

¿Qué son los objetos de página?

El objeto de página es un patrón de diseño que se ha vuelto popular para escribir pruebas e2e con el fin de mejorar el mantenimiento de la prueba y reducir la duplicación de código. Puede definirse como una clase orientada a objetos que sirve como interfaz para una página de su AUT (aplicación bajo prueba). Pero, antes de profundizar en los objetos de la página, debemos comprender los desafíos de las pruebas de IU automatizadas y las formas de manejarlos.

Desafíos con las pruebas de IU automatizadas

Los siguientes son algunos desafíos comunes con las pruebas de IU automatizadas:

Cambios en la interfaz de usuario

Los problemas más comunes al trabajar con pruebas de IU son los cambios que ocurren en la IU. Por ejemplo, sucede la mayoría de las veces que los botones o cuadros de texto, etc., generalmente tienen cambios y crean problemas para las pruebas de IU.

Falta de compatibilidad con DSL (lenguaje específico de dominio)

Otro problema con las pruebas de IU es la falta de compatibilidad con DSL. Con este problema, resulta muy difícil comprender qué se está probando.

Mucha repetición / duplicación de código

El siguiente problema común en las pruebas de IU es que hay mucha repetición o duplicación de código. Se puede entender con la ayuda de las siguientes líneas de código:

element(by.model(‘event.name’)).sendKeys(‘An Event’);
element(by.model(‘event.name’)).sendKeys(‘Module 3’);
element(by.model(‘event.name’));

Mantenimiento riguroso

Debido a los desafíos anteriores, el mantenimiento se convierte en un dolor de cabeza. Es porque tenemos que encontrar todas las instancias, reemplazar con el nuevo nombre, selector y otro código. También necesitamos dedicar mucho tiempo a mantener las pruebas en línea con la refactorización.

Pruebas rotas

Otro desafío en las pruebas de IU es la ocurrencia de muchos fallos en las pruebas.

Maneras de afrontar los desafíos

Hemos visto algunos desafíos comunes de las pruebas de IU. Algunas de las formas de manejar estos desafíos son las siguientes:

Actualizar referencias manualmente

La primera opción para manejar los desafíos anteriores es actualizar las referencias manualmente. El problema con esta opción es que debemos hacer el cambio manual en el código así como nuestras pruebas. Esto se puede hacer cuando tiene uno o dos archivos de prueba, pero ¿qué sucede si tiene cientos de archivos de prueba en un proyecto?

Usar objetos de página

Otra opción para manejar los desafíos anteriores es usar objetos de página. Un objeto de página es básicamente un JavaScript simple que encapsula las propiedades de una plantilla angular. Por ejemplo, el siguiente archivo de especificación se escribe sin y con objetos de página para comprender la diferencia:

Without Page Objects

describe('angularjs homepage', function() {
   it('should greet the named user', function() {
      browser.get('http://www.angularjs.org');
      element(by.model('yourName')).sendKeys('Julie');
      var greeting = element(by.binding('yourName'));
      expect(greeting.getText()).toEqual('Hello Julie!');
   });
});

With Page Objects

Para escribir el código con objetos de página, lo primero que debemos hacer es crear un objeto de página. Por lo tanto, un objeto de página para el ejemplo anterior podría verse así:

var AngularHomepage = function() {
   var nameInput = element(by.model('yourName'));
   var greeting = element(by.binding('yourName'));

   this.get = function() {
      browser.get('http://www.angularjs.org');
   };

   this.setName = function(name) {
      nameInput.sendKeys(name);
   };
   
   this.getGreetingText = function() {
      return greeting.getText();
   };
};
module.exports = new AngularHomepage();

Uso de objetos de página para organizar pruebas

Hemos visto el uso de objetos de página en el ejemplo anterior para manejar los desafíos de las pruebas de IU. A continuación, vamos a discutir cómo podemos usarlos para organizar las pruebas. Para esto, necesitamos modificar el script de prueba sin modificar la funcionalidad del script de prueba.

Ejemplo

Para comprender este concepto, tomamos el archivo de configuración anterior con objetos de página. Necesitamos modificar el script de prueba de la siguiente manera:

var angularHomepage = require('./AngularHomepage');
describe('angularjs homepage', function() {
   it('should greet the named user', function() {
      angularHomepage.get();

      angularHomepage.setName('Julie');
   
      expect(angularHomepage.getGreetingText()).toEqual
      ('Hello Julie!');
   });
});

Aquí, tenga en cuenta que la ruta al objeto de la página será relativa a su especificación.

En la misma nota, también podemos separar nuestro conjunto de pruebas en varios conjuntos de pruebas. El archivo de configuración se puede cambiar de la siguiente manera

exports.config = {
   // The address of a running selenium server.
   seleniumAddress: 'http://localhost:4444/wd/hub',

   // Capabilities to be passed to the webdriver instance.
   capabilities: {
      'browserName': 'chrome'
   },
   // Spec patterns are relative to the location of the spec file. They may
   // include glob patterns.
   suites: {
      homepage: 'tests/e2e/homepage/**/*Spec.js',
      search: ['tests/e2e/contact_search/**/*Spec.js',
         'tests/e2e/venue_search/**/*Spec.js']
   },

   // Options to be passed to Jasmine-node.
   jasmineNodeOpts: {
      showColors: true, // Use colors in the command line report.
   }
};

Ahora, podemos cambiar fácilmente entre ejecutar una u otra suite de pruebas. El siguiente comando ejecutará solo la sección de la página de inicio de la prueba:

protractor protractor.conf.js --suite homepage

De manera similar, podemos ejecutar conjuntos de pruebas específicos con el comando de la siguiente manera:

protractor protractor.conf.js --suite homepage,search