Cucumber-js: Tambahkan partisi kerja kustom untuk runtime paralel.

Dibuat pada 2 Mar 2018  ·  7Komentar  ·  Sumber: cucumber/cucumber-js

Saya telah melihat fitur pengujian paralel eksperimental, dan saya pikir ini mungkin memerlukan mekanisme untuk mengontrol cara kerja budak yang berbeda.

Melihat cucumber-js/src/runtime/parallel/master.js:110 , saya dapat melihat bahwa budak diberikan pekerjaan dari antrian. Kedengarannya bagus dalam kasus umum, tetapi saya tidak bisa menggunakannya apa adanya. Jika kasus saya mirip dengan kasus lain, saya ingin menyarankan bahwa mungkin untuk mengubah strategi alokasi kerja.

Saya menjalankan tes e2e menggunakan Selenium, dan tes yang berbeda mengakses beberapa database yang berbeda. Jadi fitur saya terlihat seperti;

Scenario: I can log in to the db1 database
 When I log in to the "db1" database
 Then ...

Scenario: I can create a user in the db2 database
 When I log in to the "db2" database
 Then ...

Basis data tersebut adalah sumber daya bersama, dan dikembalikan ke server, digunakan, dan dijatuhkan selama pengujian. Jika dua budak mencoba mengakses database yang sama pada saat yang sama, mereka akan gagal.

Pada akhirnya, saya dapat mempartisi file fitur ke budak dengan tepat;

| feature         | database | slave |
| test1.feature   | dbA      |     1 |
| test2.feature   | dbB      |     1 |
| test3.feature   | dbC      |     2 |
| test4.feature   | dbC      |     2 |
| test5.feature   | dbC      |     2 |

Tetapi saya tidak melihat mekanisme di mana pelari uji paralel dapat bertanya kepada saya di mana saya ingin menjalankan skenario.

Apakah mungkin untuk memiliki titik ekstensi, 'pemartisi kerja khusus', yang akan menanyakan sesuatu seperti;

getSlaveAffinity(featureFilePath, numberOfSlaves);

yang akan mengembalikan budak untuk meletakkan file fitur?

enhancement

Komentar yang paling membantu

Apa status saat ini dengan fitur ini? Saya senang untuk menyumbangkan waktu untuk menerapkan POC jika Anda dapat mengarahkan saya ke arah yang benar. Saya suka ide menggunakan tag pada skenario untuk menentukan sumber daya mana yang memerlukan mutex untuk dieksekusi.

Semua 7 komentar

Hmm, jadi saat ini menggunakan antrian acar (skenario atau salah satu contoh dari skenario skenario), bukan fitur. Dan tampaknya tujuan utamanya adalah tidak ada dua skenario yang saling bertentangan yang berjalan pada saat yang bersamaan. Budak apa yang mereka jalankan seharusnya tidak masalah.

Pemikiran tentang API seperti

const {setParallelCanAssignFn} = require('cucumber')

// testCase = {uri, pickle}
// runningTestCases = [{uri, pickle}, ... ]
setParallelCanAssignFn((newTestCase, runningTestCases) => {
  // return true if newTestCase can be alongside the currently running test cases, false otherwise
})

Kemudian ketika seorang budak bebas, ia melihat ke bawah daftar acar dan menetapkannya sebagai yang pertama untuk mengembalikan fungsi ini. Fungsi default selalu mengembalikan nilai true.

Saya suka itu! Saya punya banyak pikiran kecil ...

Ini jelas tampak seperti opsi yang lebih kuat, ya. Ini memiliki efek menyeimbangkan pekerjaan antara para pekerja di kolam dengan baik. Dalam saran saya sebelumnya, saya harus memperkirakan biaya waktu menjalankan tes, dan mencoba menyeimbangkan semuanya; tidak seefisien atau semudah menugaskan pekerja yang menganggur!

Saya juga lebih suka menggunakan acar - partisi saya bekerja dengan menelan untuk menemukan file fitur, memuatnya melalui parser Gherkin dan memeriksa AST untuk langkah-langkah yang relevan - jadi hampir semua kode saya membuat ulang beberapa internal mentimun. Karena Anda memilikinya dan dapat memberikannya sebagai parameter, itu membuat hidup saya lebih mudah! :) Saya melihat API ini dekat dengan tetapi tidak sama dengan formatter; dalam formatter saya bisa menulis

    options.eventBroadcaster.on('test-case-started', ({ sourceLocation }) => {
        const { gherkinDocument, pickle } = options.eventDataCollector.getTestCaseData(sourceLocation);

Bisakah test case yang diteruskan ke fungsi mendapatkan parameter atau struktur test case yang sama ( { gherkinDocument, pickle } ) sebagai acara formatter? Saya sedang memikirkan kasus sederhana di mana Anda perlu mempartisi berdasarkan tag (misalnya @uses(DB1) yang saya temukan di gherkinDocument. Juga, API serupa mungkin berarti lebih sedikit dokumentasi dan lebih banyak kode yang digunakan kembali?

Hanya untuk memperjelas, setParallelCanAssignFn akan dirancang untuk dijalankan pada master ('siapa yang harus mendapatkan pekerjaan?'), daripada pada slave ('dapatkah saya menerima pekerjaan ini?') Seorang pelaksana tidak perlu khawatir tentang multi-threading, benar, karena master akan memiliki tanggung jawab tunggal, single-threaded untuk menugaskan pekerjaan?

Saya juga harus menyebutkan urutan eksekusi, saya pikir. Mekanisme ini memungkinkan Anda menolak tes lalu menerimanya nanti. Jadi file fitur ditulis

Feature: X
    Scenario: A
    Scenario: B

Sebenarnya bisa dieksekusi dalam urutan [B,A] . Itu kemungkinan akan merusak test suite seseorang di suatu tempat di dunia. Bukannya seharusnya - urutan eksekusi seharusnya tidak masalah - tetapi ini sepertinya pertama kalinya mentimun akan memungkinkan skenario dieksekusi di luar urutan file fitur.

Bagaimanapun, terima kasih telah memikirkannya!

Apa status saat ini dengan fitur ini? Saya senang untuk menyumbangkan waktu untuk menerapkan POC jika Anda dapat mengarahkan saya ke arah yang benar. Saya suka ide menggunakan tag pada skenario untuk menentukan sumber daya mana yang memerlukan mutex untuk dieksekusi.

Halo,

Saya berada dalam situasi yang sama dalam situasi pengaturan ulang basis data seperti

Setidaknya saya bisa melakukan grup "tanpa basis data" dan grup "menggunakan basis data".

Ya! Saya juga sangat menginginkan fungsi ini. Saya akan menyiapkan POC (kecuali ada sesuatu yang masuk). Ini akan menjadi kontribusi publik pertama saya. Mari kita lihat bagaimana kelanjutannya. Kira saya akan cepat menelusuri pedoman pertama.

@ eman2673 Hanya untuk memberi tahu Anda: saya menyelesaikan masalah paralel dengan memulai satu instance per tag melalui CLI Host (scaleway untuk saya).

Sama sekali bukan asli mentimun-js tetapi sangat efisien dan memungkinkan kami untuk melakukan tes penuh pada setiap penggabungan pada master.
Dan dengan metode ini, saya juga bisa melakukan satu contoh per file pengujian jika saya mau.

@adrien-carre Terima kasih atas perhatiannya. Saya mencari sedikit lebih banyak kontrol. Saya ingin membuang semua pekerja dalam segala hal dan mereka secara ajaib hanya bekerja pada kasus uji yang tidak bertentangan dengan sumber daya. Saya juga ingin dapat menandai skenario sebagai memanfaatkan banyak sumber daya (biasanya 1 atau 2 tabel). Mencoba menerapkan pendekatan @charlierudolph yang disebutkan di atas.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat