angular - Kuinka voin suorittaa Typescript-tyylisen periytymisen jasmine/protractor-testeissäni?


Projektissani käytän protractoria + jasminea + TypeScriptiä e2e-testeihin. Olen jo hyötynyt TypeScriptin perintäominaisuudesta sivuobjektitiedostoissani (esimerkiksi minulla on BasePageObject-luokka, jossa on yleisiä metodeja/objekteja, joista muut PageObjectit periytyvät). Haluaisin ottaa saman lähestymistavan käyttöön testeissäni. Tässä esimerkki koodista, joka minulla on tällä hetkellä:

Testisarja A [ATest.ts]:

import {
     SomePage,
     LoginPage
} from '../pages';


describe('test suite A', () => {
    let loginPage: LoginPage = new LoginPage();
    let somePage: SomePage = new SomePage();

    beforeAll(() => {
        loginPage.login();
        somePage.navigateTo();
    });

    it('my test 1', () => {
        //test body, assertions etc.
    });

    it('my test 2', () => {
        //test body, assertions etc.
    });
});

Testisarja B [BTest.ts]:

import {
     AnotherPage,
     LoginPage
} from '../pages';


describe('test suite B', () => {
    let loginPage: LoginPage = new LoginPage();
    let anotherPage: AnotherPage = new AnotherPage();

    beforeAll(() => {
        loginPage.login();
        anotherPage.navigateTo();
    });

    it('my test 1', () => {
        //test body, assertions etc.
    });

    it('my test 2', () => {
        //test body, assertions etc.
    });
});

Kuten näette, osa koodista on yhteistä molemmille paketeille. Mitä haluaisin saavuttaa, on perintö TC:issani, kirjoittaakseni ne enemmän Java-tyyliin ja välttääkseni koodin kopiointia (esimerkiksi):

class BaseTestCase {
    beforeAll() {
        loginAction();
    }
}

class TestA extends BaseTestCase {
     beforeAll() {
         specificStuff();
     }
}

class TestB extends BaseTestCase {
     beforeAll() {
         specificStuff();
     }
}

Onko se mahdollista jasmiinissa?

Vastaus #1

Voisit luoda perustason luokan ja laajentaa sitä melko helposti, sitten korvata palautuskutsut funktioilla.

export abstract class BaseTest {
  abstract loginAction(): void;
  abstract specificStuff(): void;
}

export class FooTest extends BaseTest {
  loginAction(): void {
    // does stuff to login
  }
  specificStuff(): void {
    // do tests and expectations
  }
}

Testissäsi:

// Do some importing for FooTest.

describe('test suite A', () => {
  let fooTest = new FooTest();

  beforeAll(fooTest.loginAction);

  it('should do some specific stuff', fooTest.specificStuff);
});

Pitäisikö sinun tehdä tämä?

Tämän tekeminen on mahdollista; kuitenkin, onko tämä jotain, mitä haluat tehdä? Kuvittelen, että FooTest-luokkametodisi tekee joitain odotuksia testissä. Tämä on (mielestäni) ei hyvä malli seurata. it-lohkojen tulisi sisältää odotuksesi sen sijaan, että ne otetaan ulos.

Vastaus #2

Tämä "Jasmine describe override" näyttää lupaavalta ja aion kokeilla sitä: https://ajsblackbelt.wordpress.com/2016/05/06/jasmine-describe-override/

(Tätä koodia ei ole vielä testattu)

global.myDescribe = function (name, arg1, arg2, suite) {
  describe(name, function){
    _myDescribeLogic(name, arg1, arg2, suite);
  }
};

function _myDescribeLogic(name, arg1, arg2, suite) {
  beforeAll(function (done) {
    // code
  });
  beforeEach(function (done) {
    // code
  });

  afterAll(function (done) {
    // code
  });
  afterEach(function (done) {
    // code
  });
}

Lisää tämä Protractorin asetustiedostoosi:

onPrepare: 'src/framework/myOnPreapre.js'

Ja sitten tämän pitäisi toimia:

myDescribe('a suite', 'foo', 'bar', function(){
  it('should test a business function', function(){
    // code
  })
})

Älä unohda laajentaa x- ja fdescribea, kuten artikkelissa kuvataan.

Miksi haluaisin tehdä niin? Koska jotkut asiat ovat aina samoja jokaisessa testissä, kuten kirjautuminen (kyllä, paitsi kirjautumistestien osalta, jotka on jätetty tästä pois). Enkä halua kopioida ja tuhlata tarvittavia before*()-funktioita tiedostosta toiseen.

Pitäisi olla paikka, jossa määrittelen tällaiset yleiset asiat, ja haluan sen olevan käytettävissä ilman virheitä (kuten unohtamista tai virheitä kopioinnin, liittämisen ja muokkaamisen aikana).

Minulle on hälinää lukea samoja koodirivejä yhä uudelleen. Se tekee testistä vähemmän luettavan. Haluan vain lukea testiin liittyviä asioita. Kaikki muu on kontekstia. En välitä kirjautumisesta, jos testi käsittelee tekstin kirjoittamista ja tallentamista.

Erilaisista syistä en pidä siitä, että jasmine/protractor-testit perustuvat erillisiin tiedostoihin. Minulle yhden tiedoston testit ovat vain alasarja. 'Todellinen' sarja ovat kaikki testitiedostoni.

Aiheeseen liittyviä artikkeleita