Mocha: --Pilihan pesanan untuk pesanan tes acak?

Dibuat pada 18 Jun 2013  ·  66Komentar  ·  Sumber: mochajs/mocha

Opsi --order akan memungkinkan orang menemukan ketergantungan pesanan. Ketiga opsi tersebut adalah --order random , --order random:seed , dan --order default . Setiap rangkaian acak mengeluarkan benih yang digunakannya.

RSpec mengimplementasikan ini, tetapi urutan defaultnya adalah acak. Mocha tidak harus melakukan itu. Beberapa detail tentang parameter --order ada di sini: http://blog.davidchelimsky.net/2012/01/04/rspec-28-is-released/

Bagaimana menurut anda?

feature help wanted

Komentar yang paling membantu

Meskipun mudah to avoid cross-test dependencies without help of tooling , juga mudah untuk menambahkan ketergantungan seperti itu dalam rangkaian pengujian tanpa menyadarinya. Bug dalam rangkaian pengujian biasanya diterjemahkan menjadi bug dalam sistem yang diuji. Bug ini sulit dilacak, karena kodenya seharusnya tercakup dalam pengujian.

Pengujian untuk tidak adanya dependensi uji silang tidak mungkin dilakukan tanpa perkakas.

@visionmedia , harap pertimbangkan kembali.

Semua 66 komentar

meh, cukup mudah untuk menghindari ketergantungan uji silang tanpa bantuan perkakas

Meskipun mudah to avoid cross-test dependencies without help of tooling , juga mudah untuk menambahkan ketergantungan seperti itu dalam rangkaian pengujian tanpa menyadarinya. Bug dalam rangkaian pengujian biasanya diterjemahkan menjadi bug dalam sistem yang diuji. Bug ini sulit dilacak, karena kodenya seharusnya tercakup dalam pengujian.

Pengujian untuk tidak adanya dependensi uji silang tidak mungkin dilakukan tanpa perkakas.

@visionmedia , harap pertimbangkan kembali.

+1 @yanovich. Saya akan menggunakan opsi pesanan acak yang menghasilkan nomor benih. Ini akan sangat berguna dalam lingkungan CI.

@visionmedia , model mongoose memberikan contoh mudah tentang dependensi uji silang. mongoose.model 'User', UserSchema menambahkan model ke array mongoose.models . Jadi dimungkinkan untuk membuat file yang bergantung pada model pengguna yang dimuat di mongoose.models. Ambil Comment.find().populate('_user').exec(cb) sebagai contoh. Jika tes pengguna berjalan sebelum tes komentar, ini akan berjalan dengan baik, karena mungkin require('./models/user') (atau sesuatu), telah memuat model User ke mongoose.models. Tetapi jika tes komentar dijalankan sebelum tes pengguna Anda akan mendapatkan kesalahan ini Schema hasn't been registered for model "User" . Ini bisa terjadi dalam produksi ketika api komentar dijalankan sebelum api pengguna dan file komentar tidak tahu bahwa ia memiliki ketergantungan lintas file.

Dimungkinkan untuk tetap memiliki masalah produksi dengan pengujian yang berfungsi jika file pengujian telah memerlukan ('./ models / user') (atau apa pun) dan yang memuat pengguna ke mongoose.models. Namun memiliki urutan acak akan menjadi salah satu alat yang berguna untuk menemukan masalah potensial seperti ini.

Saya berharap bisa mengartikulasikannya dengan baik. Menantikan pendapat Anda.

maaf, saya pikir itu berlebihan, moka cukup kembung apa adanya. Jika ada lebih banyak minat maka mungkin itu akan sepadan dengan beban pemeliharaan.

Terima kasih telah memikirkannya.

Seperti kebanyakan hal dalam kode, mudah bagi orang yang tahu untuk menghindari melakukan ini dengan sengaja. Lebih sulit untuk menghindari melakukannya secara tidak sengaja. Dan jika Anda tidak tahu itu bahkan menjadi masalah (yaitu tim pengalaman campuran) itu benar-benar mungkin terjadi :)

Sepertinya cukup banyak orang yang tertarik padanya (dan banyak yang mengira itu salah satu fitur terbaik dari minitest). Jika itu akan digabungkan, saya dengan senang hati menerapkannya.

+1 tertarik.

Akan menyenangkan untuk dimiliki! Saya menemukan pengujian saya gagal dengan mengganti nama file, ugh.

+1 ini penting

: +1:

: +1:

+1 Ini adalah kekurangan yang cukup besar.

semantik rspec cukup solid: Anda dapat mengirimkan benih pesanan, atau dapat mengambilnya secara acak. Jika mengambil benih secara acak, ia mencetaknya, sehingga mudah untuk diperbanyak.

Seringkali tidak mudah untuk menghindari ketergantungan uji silang. Terkadang karena interaksi global yang tidak terduga, terkadang karena kenyamanan. Saya menduga lebih dari 50% proyek yang menggunakan moka akan mengalami kegagalan pengujian jika pesanan diacak. Berikut beberapa contoh yang tampaknya bergantung pada urutan eksekusi pengujian:

https://github.com/visionmedia/mocha/blob/master/test/hook.async.js#L95
https://github.com/visionmedia/superagent/blob/master/test/node/not-modified.js#L31

Keduanya terdaftar sebagai rangkaian pengujian contoh di http://visionmedia.github.io/mocha/ dan saya tidak menghabiskan banyak waktu untuk mencari masalah.

Saya akan membukanya kembali. Saya pikir itu akan membantu. Meskipun ada cara untuk menentukan departemen uji silang tanpa perkakas, jika kita dapat mengotomatiskannya, ini akan menghemat waktu orang.

Setelah sedikit mempermainkan hal ini, tampaknya tidak sepele karena sifat hierarki Suites. Pengujian dijalankan secara berulang ke dalam Suites. Untuk menjalankan _Tests_ secara acak, kita harus menghitungnya, mengacaknya, lalu bekerja mundur.

Ini akan menyebabkan before() dan after() Hooks menjadi tidak berarti karena mereka akan dieksekusi _n_ kali per _n_ pengujian dalam Suite (atau lebih tepatnya, dalam kasus _worst_, tetapi hanya jika kita berhati-hati ), karena kami terus mengubah konteks. Kedengarannya itu akan menimbulkan penalti kinerja.

Menggunakan seed acak dan melaporkan seed yang dihasilkan secara otomatis tampaknya sepele, namun, pelapor mungkin perlu mengetahui informasi ini, sehingga membutuhkan implementasi di reporter.

Tentu saja, saya berasumsi bahwa yang saya jelaskan di sini adalah apa yang diminta. Fitur seperti ini membutuhkan spesifikasi.

Pilihan lainnya termasuk "acak Suites" atau "uji acak dalam Suites" atau kombinasi keduanya. Secara praktis, ini berarti bahwa setelah Anda berada di describe() block _A_, Anda tidak dapat menjalankan pengujian pada orang tua atau saudara mana pun describe() block _B_ hingga semua pengujian di _A_ telah dijalankan (yang mana tampaknya implementasi yang jauh lebih mudah, dan tidak akan menyebabkan keributan dengan before() / after() ).

Apa yang saya (dan menurut saya orang lain) minta adalah opsi yang paling sederhana:

  • mengacak tes pada tingkat terendah: dalam satu blok uraian; kocok pernyataan "itu".
  • acak urutan suite tingkat atas (atau acak urutan file yang dimuat)

Saya tidak berpikir ada banyak manfaat dalam mengacak hal-hal di tingkat menengah.

Tentu saja peretasan, tetapi berfungsi untuk tingkat terendah https://github.com/syrnick/mocha/compare/random_order?expand=1&w=0

mocha - fail
connect - pass
superagent - fail
express - pass** 
websocket.io - pass (can't tell for sure)

** Saya mendapat 2 kegagalan terputus-putus dari 100 rangkaian pengujian yang dijalankan.

Oke, itu pasti lebih mudah untuk diterapkan!

Saya melihat lib seedrandom untuk ini; gunakan opsi pass .

Akan menerima PR.

Saya mungkin akan membersihkan kode itu dan menyesuaikan rangkaian pengujian selama beberapa hari ke depan. Apakah garis bawah terlalu ketergantungan untuk ini? Saya mungkin bisa menggunakan sesuatu yang ringan seperti ini: http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript.

@boneskull Saya mendukung keputusan Anda untuk membuka kembali ini. : +1:

Pilihan lainnya termasuk "acak Suites" atau "uji acak dalam Suites" atau kombinasi keduanya.

Sepertinya lebih dari cukup bagi saya. Tidak perlu mengulang habis-habisan, menghitung dan mengocok.

Senang mendengar ini terjadi.

Saya ingin tahu apakah rspec telah menangani pengocokan rekursif? Mungkin menarik untuk dilihat
pada kode mereka?

Pada hari Selasa, 26 Agustus 2014, Joshua Appelman [email protected]
menulis:

@boneskull https://github.com/boneskull Saya mendukung keputusan Anda
buka kembali ini. [gambar:: +1:]

Pilihan lain termasuk "acak Suites" atau "uji acak dalam
Suites "atau kombinasi keduanya.

Sepertinya lebih dari cukup bagi saya. Tidak perlu berulang-ulang,
menghitung dan mengocok.

-
Balas email ini secara langsung atau lihat di GitHub
https://github.com/visionmedia/mocha/issues/902#issuecomment -53482124.

@syrnick Saya tidak ingin menerima PR dengan ketergantungan yang begitu besar, dan sebaliknya menggunakan seedrandom . Tanpa itu, saya tidak yakin bagaimana Anda akan mendukung penyemaian. seedrandom memungkinkan Anda untuk menentukan benih atau tidak, dan jika tidak, itu akan mengembalikan benih kepada Anda. Kemudian kami dapat menampilkannya kepada pengguna dan mengizinkan mereka untuk menentukannya, ala RSpec.

@syrnick Ingatlah bahwa jika Anda menghasilkan benih, benih mungkin tidak "dapat dipindahkan" tanpa memberikannya kepada wartawan. Saya tidak terlalu paham dengan arsitektur pelaporan, jadi saya tidak dapat memberi tahu Anda secara pasti, atau apa yang harus dilakukan ...

+1

Saya belum melihat implementasinya, tetapi +1 untuk eksekusi uji yang diurutkan secara acak secara default menjadi sangat penting.

@syrnick Tolong beri tahu saya jika Anda berniat melakukan ini, terima kasih.

Saya senang melakukannya, tetapi saya tidak memiliki ETA langsung.

: +1 :, kalian masih butuh bantuan dengan PR?

Memang, sepertinya tidak ada yang mulai mengerjakan ini.

Pertama, sepertinya pengocokan Fisher-Yates akan berhasil di sini.

Kedua, saya lebih suka memiliki --order random , --order random-suites , dan --order default sebagai tiga argumen, dengan opsional :<seed> .

+1. Baru saja menemukan bug yang akan muncul sejak lama jika pengujian dilakukan secara acak. Mirip dengan bagaimana RSpec mendukungnya.

Berikut beberapa kode yang menggambarkan kegunaan pengurutan uji acak. Meskipun ada contoh yang lebih sederhana, ini adalah salah satu yang baru saja saya temui selama demo TDD. Jika Anda membalik urutan pengujian, pengujian pertama selalu gagal.

game.js:

var express = require('express');
app = exports.app = express();

var sum = 0;

app.post('/bowl/:pins', function(req,res) {
    var score = parseInt(req.params.pins);
    console.log('Bowled ' + score);
    sum += parseInt(req.params.pins);
});

app.get('/score', function(req,res) {
    console.log('Sum: ' + sum);
    res.send(sum + '');
});

app.listen(process.env.PORT || 3000);

test \ gameTest.js:

var request = require('supertest'),
    should = require('should'),
    game = require('../game.js').app;

describe('a game of bowling', function() {
    describe('a gutter game', function() {
        it('should score 0', function(done){
            request(game).get('/score').expect(200, '0', done);
        });
    });

    describe('a single pin game', function() {
        it('should score 20', function(done){
            for(var i = 0; i < 20; i++) {
                request(game).post('/bowl/1').expect(200, done);
            }
            request(game).get('/score').expect(200, '20', done); 
        });
    });
});

Saya akan senang bila memiliki ini.

: +1:

Setelah Anda melibatkan beberapa global (ini adalah Javascript, ingat), mulai menghentikan panggilan server, dan memasukkan / menghapus sesuatu dari DOM dalam pengujian Anda, _very_ mudah untuk menambahkan ketergantungan-pesanan. Mengacak urutan tes akan membantu menemukan ini lebih awal daripada nanti.
: +1:

: +1:

: +1:

+1

Urutan acak secara default, dengan seed opsional untuk membuat ulang pemesanan, akan menjadi fitur yang bagus untuk dimiliki.

1 untuk memilikinya, pengujian saya terkadang gagal saat dijalankan dalam urutan acak ...

Sementara itu, unix untuk menyelamatkan (Sayangnya, seed acak tidak didukung):

mocha `ls -1 test/*.js | sort --random-sort `

Sedang googling untuk apa pesanan mocha menjalankan tes dan menemukan ini. Jika tidak ada pengacakan, apa urutan proses default? Apakah selalu urutan pengujian muncul secara fisik dalam file?

: +1:

@danielabar ya mereka akan di-urutan mereka muncul di file.

@NicolasJacob baik, benih acak sebenarnya mungkin sampai batas tertentu, btw. :)

$ seq 10 | shuf --random-source=<(yes 2883)
1
7
3
4
6
2
10
5
9
8

@boneskull meskipun ini adalah masalah lama, apakah label PR Please masih valid? Jika demikian, saya akan mendapatkan sesuatu yang dikontribusikan pada hari berikutnya atau lebih.

Saya pikir dalam upaya untuk akhirnya mencoba menjaga inti moka minimal, tim mungkin ragu-ragu untuk memperkenalkan banyak fitur baru. Rilis utama moka berikutnya bertujuan untuk memiliki antarmuka yang dapat dicolokkan.

Bolehkah saya menyarankan hanya menggunakan https://github.com/bahmutov/rocha jika berhasil?

Saus yang luar biasa

Apa yang Anda maksud dengan antarmuka yang dapat dicolokkan? Apakah mungkin untuk memperkenalkan urutan pengujian secara acak melalui antarmuka ini?

1 untuk permintaan fitur

@sulabhjain , pendukung sebelumnya dan berikut, silakan gunakan reaksi +1 sebagai gantinya.

Kemajuan di cabang ini .

1 untuk fitur ini

Ini benar-benar salah satu fitur paling penting untuk kerangka pengujian untuk membantu menjaga pengujian tetap independen. Setiap kerangka kerja pengujian JVM utama memiliki fitur dasar ini.

1 untuk fitur ini. Ya, mudah untuk menghindari dependensi pengujian dengan pengalaman yang cukup dan / atau bekerja sendiri, tetapi tidak selalu demikian.

Bagi mereka yang tertarik dengan fitur ini, mereka dapat mengirim PR terhadap cabang pengacakan untuk membantu menyelesaikan apa yang tersisa.

1 untuk fitur tersebut. Sangat menghargai bahwa ada cabang yang sedang berlangsung untuk ini.

Masih menunggu ini :))

Ini bisa sangat berguna.
@tj Saya mengerti bahwa mudah untuk menghindari ketergantungan pengujian saat Anda bekerja dengan orang-orang yang memiliki beberapa keterampilan dasar tentang pengujian, tetapi terkadang Anda perlu mengambil alih tim pengembangan dan Anda dapat bertemu dengan orang-orang yang bahkan tidak memiliki pengetahuan dasar tentang kasus pengujian.

Sebenarnya, ini juga berguna ketika Anda mengambil alih proyek yang ada dan ingin dengan mudah memeriksa apakah satu tes terkait dengan tes sebelumnya.

@boneskull Kerja bagus! Apa status perbaikan ini? Apakah Anda membutuhkan bantuan dalam segala hal?

Saya hanya ingin membagikan solusi sementara saya yang saya gunakan untuk menjalankan tes moka secara acak. Mungkin akan bermanfaat bagi seseorang.

mocha $(find tests/ -name *.spec.js | shuf)

Sayangnya itu tidak mengocok contoh uji dalam contoh yang sama, tetapi itu masih cukup pintar dan praktis!

+1 untuk mendukung fitur ini

Ini masih di atas meja, tapi butuh perhatian dari bukan saya

Jadi, apa sebenarnya yang tersisa di sini? Dimana saya bisa memulai?

Akan sangat senang melihat itu diterapkan ❤️

Saya baru saja menemukan paket choma , yang menyediakan plugin yang sangat sederhana bagi Mocha untuk mengacak urutan rangkaian uji dan kasus. Alternatif yang baik untuk rocha, yang telah disebutkan sebelumnya. Sederhana dan pecahkan masalah untuk saya!

Alternatifnya adalah menjalankan pengujian secara paralel:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

CADBOT picture CADBOT  ·  3Komentar

seelikes picture seelikes  ·  3Komentar

adamhooper picture adamhooper  ·  3Komentar

robertherber picture robertherber  ·  3Komentar

jamietre picture jamietre  ·  3Komentar