angular - Bagaimana saya bisa melakukan pewarisan gaya typescript dalam tes jasmine/protractor saya?


Dalam proyek saya saya menggunakan protractor + jasmine + TypeScript untuk pengujian e2e. Saya sudah mendapatkan manfaat dari kelebihan TypeScript dalam pewarisan di file objek halaman saya (misalnya, saya memiliki beberapa kelas BasePageObject dengan metode/objek umum dari mana sisa PageObjects diturunkan). Saya ingin memperkenalkan pendekatan yang sama dalam pengujian saya. Berikut contoh kode, yang saya miliki saat ini:

Suite pengujian 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.
    });
});

Suite pengujian 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.
    });
});

Seperti yang Anda lihat, sebagian kode umum untuk kedua suite. Yang ingin saya capai adalah pewarisan dalam TC saya, untuk menulisnya lebih bergaya Java dan menghindari penggandaan kode (misalnya):

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

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

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

Apakah mungkin di jasmine?

Jawaban #1

Anda bisa membuat kelas dasar dan memperluasnya dengan cukup mudah kemudian mengganti callback dengan fungsi.

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
  }
}

Dalam tes Anda:

// Do some importing for FooTest.

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

  beforeAll(fooTest.loginAction);

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

Haruskah Anda melakukan ini?

Adalah mungkin untuk melakukan ini; namun, apakah ini sesuatu yang ingin Anda lakukan? Saya membayangkan metode kelas FooTest Anda akan melakukan beberapa ekspektasi pada tes. Ini (menurut pendapat saya) bukan pola yang baik untuk diikuti. Blok it Anda seharusnya berisi ekspektasi Anda daripada mengekstraknya.

Jawaban #2

“Jasmine describe override” ini terlihat menjanjikan dan saya akan mencobanya: https://ajsblackbelt.wordpress.com/2016/05/06/jasmine-describe-override/

(Kode ini belum diuji)

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
  });
}

Tambahkan ini di file konfigurasi protractor Anda:

onPrepare: 'src/framework/myOnPreapre.js'

Dan kemudian ini seharusnya berhasil:

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

Jangan lupa untuk memperluas x- dan fdescribe, seperti yang dijelaskan artikel tersebut.

Mengapa saya ingin melakukan itu? Karena beberapa hal selalu sama untuk setiap tes, seperti login (ya, kecuali untuk tes login, yang dikecualikan dari itu). Dan saya tidak ingin menyalin & membuang waktu untuk persiapan before*() yang diperlukan dari satu file ke file lain.

Seharusnya ada satu tempat di mana saya mendefinisikan hal-hal umum seperti itu dan saya ingin bisa digunakan tanpa kesalahan (seperti lupa sesuatu atau membuat kesalahan saat menyalin&menempel&mengubah).

Bagi saya, itu adalah kebisingan membaca baris kode yang sama berulang-ulang. Itu membuat tes lebih sulit dibaca. Saya hanya ingin membaca hal-hal spesifik dari tes. Semua yang lain adalah konteks. Saya tidak peduli dengan login jika tesnya tentang menulis dan menyimpan sebuah teks.

Untuk berbagai alasan saya tidak suka bahwa tes jasmine/protractor didasarkan pada file mandiri. Tes dalam satu file bagi saya hanyalah sub suite. 'Suite' yang sebenarnya adalah semua file tes saya.

Artikel terkait