Cucumber-js: tambahkan kait BeforeStep / AfterStep

Dibuat pada 4 Jan 2018  ·  33Komentar  ·  Sumber: cucumber/cucumber-js

Berguna untuk validasi setelah setiap langkah berakhir. this harus menjadi contoh dunia

Komentar yang paling membantu

Halo semua,

Adakah pembaruan tentang kait Langkah? Atau ada solusi untuk menjalankan beberapa kode sebelum dan/atau setelah setiap langkah eksekusi?

Semua 33 komentar

@charlierudolph Saya ingin membantu di sini, tetapi perlu beberapa petunjuk tentang cara yang tepat untuk mengimplementasikannya. Saya percaya ada gula sintaksis AfterStep untuk registerHandler yang telah dihapus baru-baru ini. Saya melihat support_code_library_builder/define_helpers.js. Tetapi perlu beberapa petunjuk tentang cara mengimplementasikan kait ini.
Terima kasih
Ali
PS Terima kasih telah mengembalikan format json hasil.

Sebuah pertanyaan di sini adalah bagaimana hal ini mempengaruhi alur kerja? Apakah ini bisa mengedit status hasil langkah atau bertindak sebagai langkah lain yang bisa lolos/gagal?

Kasus penggunaan yang saya lihat di salah satu komentar dan yang juga ingin saya gunakan adalah membuat tangkapan layar setelah langkah. Di mentimun ruby ​​saya telah menggunakan AfterStep yang menyediakan akses ke objek Skenario.
IMHO kait afterstep hanya boleh digunakan untuk kasus penggunaan di mana pengguna ingin mengintrospeksi hasil langkah tetapi seharusnya tidak dapat mengubah hasilnya. Saya juga berpikir bahwa seharusnya tidak ada langkah lain yang bisa lolos/gagal.

@charlierudolph Saya juga mencari solusi serupa.
Sebelum registerHandler menjadi usang, saya menggunakan kode ini untuk mengambil tangkapan layar setelah langkah-langkah yang gagal.:

```
this.registerHandler('StepResult', fungsi (acara, panggilan balik) {
var stepResult = event.getPayloadItem('stepResult');

if (stepResult.getStatus() == 'failed') {
  takeScreenshot()
    .then(function () {
      callback();
    });
} else {
  callback();
}});

````

Sekarang saya tidak punya solusi untuk ini.

Hai,

Saya telah melihat di sebagian besar utas yang saya baca tentang kait BeforeStep/AfterStep bahwa kasus penggunaan mengambil layar cetak. Ini bukan kasus penggunaan saya dan saya hanya ingin menyuarakan kasus penggunaan lain untuk kait ini:

Proyek saya telah menggunakan kait AfterStep ini dalam mentimun 1.x untuk:

  • mengumpulkan data - seperti semua tautan eksternal:
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

Semua tautan eksternal kemudian diuji dalam setelan uji terpisah.

  • Memeriksa duplikat ID elemen (tujuannya adalah untuk memastikan semua ID unik untuk mematuhi standar HTML dan juga membuat pengujian lebih mudah)
  • Memeriksa kesalahan skrip (AfterStep akan menetapkan variabel untuk After hook ke skenario yang benar-benar gagal).
  • Mengabaikan peringatan browser. Beberapa skenario pengujian membuat browser web membuka jendela peringatan yang mungkin ingin kita abaikan. Ini terutama berlaku ketika ada elemen formulir dan input, browser akan memperingatkan ("Anda memiliki perubahan yang belum disimpan ...")

Saat ini menggunakan Mentimun 4.0.0 dan Busur Derajat 4.0.14

Catatan samping: Kasus penggunaan kami tidak berfungsi dengan baik dengan this.AfterStep() di Mentimun 1.xx karena tidak dirancang untuk memiliki jenis kode ini di dalamnya dan kami melihat masalah dengan kondisi balapan. Jadi kami telah memutakhirkan ke Mentimun 4.0.0 dan menonaktifkan logika AfterStep hingga ada dukungan yang tepat untuk itu.

Hai,

ada pembaruan tentang ini sebelum/sesudah langkah kait?
Apakah ada solusi untuk kait AfterStep? Saya ingin mengambil tangkapan layar jika tes tertentu gagal.

"lampirkan" tidak tersedia untuk saya karena kami telah mengganti konstruktor Dunia default https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md

terima kasih

Hai @gajo4256 ,

Saya menggunakan mentimun 4.0.0 dan cuplikan ini:

After(function (scenario) {
  if (scenario.result.status === Status.FAILED) {
    const World = this;

    return browser.takeScreenshot().then(function (buffer) {
      return World.attach(buffer, 'image/png');
    });
  }});

Ini akan mengambil tangkapan layar setelah setiap skenario gagal. ( Ini bekerja untuk saya, karena dengan mentimun, setiap kali satu langkah gagal, seluruh skenario akan gagal, jadi hampir identik dengan "setelah langkah gagal".

Semoga membantu.

Hai @mracz ,

thnx, saya benar-benar mencoba ini (walaupun setelah setiap langkah akan lebih cocok untuk saya).
Karena saya telah mengganti konstruktor Dunia default, bagaimana saya bisa melampirkan lagi tersedia untuk saya seperti dalam kasus normal?

terima kasih

Hai @gajo4256 ,

Inilah yang saya miliki dalam implementasi dunia Kustom saya:

const { setWorldConstructor } = require('cucumber');

function CustomWorld( { attach } ) {
  this.attach = attach;
}

setWorldConstructor(CustomWorld);

@mracz , saat ini saya melakukan ini untuk setiap langkah:

    When('I do something', function () {
        return takeScreenshot(this, () => {
            return $(...).click();
        });
    });

Di mana fungsi pengambilan tangkapan layar adalah ini:

export function takeScreenshot(world, stepToExecute: () => promise.Promise<any>): promise.Promise<any> {
    return stepToExecute().then(() => {
        return doTakeScreenshot(world);
    }).catch((err) => {
        return doTakeScreenshot(world).then(() => {
            throw err;
        });
    });
}

function doTakeScreenshot(world) {
    return browser.takeScreenshot().then((screenshot) => {
        world.attach(screenshot, 'image/png');
    }).catch((err) => {
        console.warn('Could not create screenshot', err);
    });
}

Saya mungkin terlalu defensif tentang pengecualian, tetapi saya melakukan yang terbaik agar kode tambahan tidak mengganggu hasil tes yang sebenarnya. Yang terbaik yang bisa saya lakukan sekarang, pengait AfterStep yang berfungsi akan membuat saya menambahkan lebih sedikit boilerplate.

Namun, apa yang mungkin tidak dilakukan pengait adalah melewatkan tangkapan layar ketika saya membuat pernyataan yang tidak mengubah layar (sehingga tangkapan layar tidak akan berguna), misalnya Then some element is not shown . Saya kira objek dunia yang dapat diperpanjang dapat membantu di luar sana.

Berikut adalah kasus penggunaan lain untuk AfterStep hooks: Tunggu rekan-rekan untuk menyinkronkan (menggunakan jam vektor atau stempel waktu lamport). /cc @tooky @jbpros

Halo semuanya.
Saya sebenarnya sedang mengerjakan masalah ini.

Kami mencari cara untuk mengambil tangkapan layar dari semua langkah kami yang berbeda.
Saat ini, kami sedang memikirkan untuk mengganti fungsi StepDefinitions dari mentimun.

Tidak tahu apakah itu cara terbaik, jadi tolong, jangan ragu untuk memberikan pendapat Anda tentang itu!

Bagi siapa pun yang berjuang, inilah cara untuk melakukan ini dengan pembungkus fungsi definisi: https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28

Kasus penggunaan utama kami akan seperti yang lain di sini: tangkapan layar, tetapi menggunakannya lebih sebagai alat debugging sehingga kami dapat melihat output dari setiap langkah jika kami mengaktifkan mode debugging dalam konfigurasi kami.

Penggunaan lain: kami memiliki beberapa modal yang mungkin muncul setelah jangka waktu tertentu di situs web kami. Jika kami menjalankan skenario, kami ingin memiliki pemeriksaan untuk modals tersebut di halaman setelah setiap langkah untuk memastikan pengujian kami tidak rapuh karena modals ini.

Kasus penggunaan lain: jika seseorang ingin membuat alat pelaporan lengkap dengan dasbor (status pengujian yang sedang berjalan, kasus uji yang telah dijalankan sebelumnya, dll), mentimun dapat memposting ke alat di kait langkah untuk pembaruan yang sedang berlangsung. Ini adalah contoh yang tidak biasa, saya tahu, tapi itu adalah sesuatu yang saya tertarik untuk melihat sekarang setelah saya memikirkannya.

KyleFairns, saya perlu AfterStep untuk dasbor seperti yang Anda sebutkan

Halo,

Kami ingin memeriksa apakah ada kesalahan javascript setelah setiap langkah. Tidak hanya langkah yang gagal.
(Sedikit sama dengan @ markus-lundin-86)
Sekarang kita hanya bisa melakukannya setelah setiap skenario.
Jadi apakah ini ada di peta jalan, atau adakah yang punya solusi lain?

Saya baru saja menemukan bahwa WebDriverIO memiliki kait beforeStep dan afterStep untuk mentimun yang memecahkan masalah saya.

Semoga membantu...

Halo semua,

Adakah pembaruan tentang kait Langkah? Atau ada solusi untuk menjalankan beberapa kode sebelum dan/atau setelah setiap langkah eksekusi?

Halo semua,
Dalam situasi yang sama seperti @Prasant-Sutaria.
Adakah pembaruan pada kait langkah atau solusi?
Terima kasih sebelumnya.

Tidak ada pembaruan. Masih menunggu seseorang untuk mengirimkan permintaan tarik untuk ini.

Apakah ada peta jalan atau apa pun untuk ini? Karena ini adalah salah satu poin utama untuk memiliki fitur ini, mungkin pernyataan resmi akan menyenangkan.

@aslakhellesoy apakah ada daftar periksa atau sesuatu yang perlu diimplementasikan oleh permintaan tarik? AFAIK #1058 dan #1121 mencoba menghadirkan fitur ini, atau beberapa cara untuk mengatasinya.

Hai teman-teman,
Saya baru saja membuat PR mengenai masalah ini: https://github.com/cucumber/cucumber-js/pull/1198.
Beri tahu saya jika Anda merasa berguna.

@aslakhellesoy , saya telah membuat PR di atas (#1198) untuk mengatasi masalah/permintaan fitur ini. Bisakah Anda melihatnya, atau mengarahkan saya ke seseorang yang harus saya hubungi?
cc: @charlierudolph

ada pembaruan? ditunggu juga ya :)

Saya melihat 2 PR @ leonardonelson91
Saya pikir mereka tidak menemukan cara terbaik untuk mengimplementasikan fitur ini
https://github.com/cucumber/cucumber-js/pull/1198
https://github.com/cucumber/cucumber-js/pull/1058

@charlierudolph apakah Anda memiliki pandangan tentang apakah fungsi yang terdaftar pada BeforeStep dan AfterStep masih harus dijalankan jika langkahnya habis?

Seperti beberapa orang lain di sini, saya menggunakan setDefinitionFunctionWrapper untuk mencapai tangkapan layar, yang berfungsi dengan baik kecuali saya tidak memiliki jalan masuk ketika langkah uji habis - yang terbaik yang bisa saya lakukan adalah memberikan batas waktu yang lebih singkat ke instrumentasi browser sehingga akan melempar saat langkah masih aktif. Saya berharap dapat memperbaiki setDefinitionFunctionWrapper tetapi ingin tahu apa maksudnya di sini juga.

Saya berharap BeforeStep/AfterStep akan berjalan apa pun yang terjadi terlepas dari apakah suatu langkah berlalu/gagal (karena batas waktu atau sebaliknya)

Hanya untuk menambahkan kasus penggunaan tambahan untuk ini yang bukan tentang tangkapan layar. Saya sedang menguji sistem yang digerakkan oleh peristiwa dan pengujian menyebabkan peristiwa dihasilkan. Peristiwa tersebut kemudian dibaca dan membuat perubahan pada sistem.

Langkah-langkah berikut memvalidasi sistem dalam keadaan yang diharapkan yang mengharuskan semua peristiwa telah diproses. Saya ingin kemampuan untuk memastikan antrean telah diproses sepenuhnya dan tidak ada apa pun dalam status tertunda sebelum pindah ke langkah berikutnya.

Saat ini saya sedang melakukan polling aliran acara dalam langkah-langkah validasi, tetapi akan lebih baik untuk memasukkannya ke dalam pengait. Karena itu adalah persyaratan di mana-mana bahwa sistem dalam keadaan stabil sebelum melanjutkan ke langkah berikutnya.

@davidjgoss @charlierudolph Tolong bisakah Anda membantu saya dengan contoh contoh kode setDefinitionFunctionWrapper untuk mencapai tangkapan layar BeforeStep/AfterStep?, Saya mencoba dengan Nightwatch JS

Hai @RArkasali , inilah cuplikan dari proyek yang saya kerjakan:

import {setDefinitionFunctionWrapper} from "cucumber";

setDefinitionFunctionWrapper(function(fn) {
    return async function(...args) {
        try {
            return await fn.apply(this, args);
        } catch (ex) {
            await this.takeScreenshot();
            throw ex;
        }
    };
});

(Di mana takeScreenshot adalah metode pada World khusus Anda yang melakukan hal-hal pengambilan tangkapan layar yang sebenarnya. Saya tidak cukup akrab dengan nightwatch untuk mengetahui seperti apa tampilannya, tetapi saya yakin Anda akan melakukannya menjadi.)

Jadi ini akan mengambil tangkapan layar jika ada kesalahan (seperti kegagalan pernyataan) dari dalam fungsi langkah. Fakta bahwa kami mengembalikan hasil non-kesalahan adalah penting - saya bingung untuk beberapa saat sementara langkah dengan return "pending" tidak ditangani, sampai saya menyadari bahwa saya menelan nilai pengembalian.

Semoga ini membantu

Halo semua,
apa status masalah ini? Apakah masih membutuhkan bantuan?
Saya tertarik dengan BeforeStep dan AfterStep, karena akan membantu saya memiliki file "log" dengan semua nama langkah dan informasi log tambahan. Ini sedikit lebih mudah daripada membuat formatter khusus.

Ini telah ditambahkan sebagai bagian dari https://github.com/cucumber/cucumber-js/pull/1416

Menutup masalah ini karena kait telah ditambahkan di https://github.com/cucumber/cucumber-js/pull/1416

Apakah halaman ini membantu?
0 / 5 - 0 peringkat