Untuk mengekstrak nilai tabel data untuk digunakan dalam ekstensi pelaporan untuk Spock, saya menggunakan kode berikut:

@Override
public void beforeIteration(IterationInfo iteration) {
    Object[] values = iteration.getDataValues();
}

Ini mengembalikan kepada saya referensi ke objek dalam tabel data. Namun, saya ingin mendapatkan nama variabel yang mereferensikan nilainya.

Misalnya, dalam tes berikut:

private static User userAge15 = instantiateUserByAge(15);
private static User userAge18 = instantiateUserByAge(18);
private static User userAge19 = instantiateUserByAge(19);
private static User userAge40 = instantiateUserByAge(40);

def "Should show popup if user is 18 or under"(User user, Boolean shouldShowPopup) {
        given: "the user <user>"

        when: "the user do whatever"
        ...something here...

        then: "the popup is shown is <showPopup>"
        showPopup == shouldShowPopup

        where:
        user        | shouldShowPopup
        userAge15   | true    
        userAge18   | true    
        userAge19   | false    
        userAge40   | false    

}

Apakah ada cara untuk menerima string "userAge15", "userAge18", "userAge19", "userAge40" alih-alih nilainya?

Motivasi untuk ini adalah bahwa objek Pengguna kompleks dengan banyak informasi seperti nama, nama keluarga, dll, dan metode toString() akan membuat klausa where tidak dapat dibaca dalam laporan yang saya hasilkan.

1
henriquels 20 November 2020, 00:58

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan specificationContext.currentFeature.dataVariables. Ini mengembalikan daftar string yang berisi nama variabel data. Ini harus bekerja baik di Spock 1.3 dan 2.0.

Edit: Maaf, Anda tidak ingin nama variabel data ["a", "b", "expected"] tetapi ["test1", "test1", "test2"]. Maaf, saya tidak dapat membantu Anda dengan itu dan tidak akan melakukannya jika saya bisa karena itu hanya cara yang mengerikan untuk memprogram IMO. Saya lebih suka memastikan output toString() dipersingkat atau dipangkas dengan cara yang sesuai, jika perlu, atau untuk (tambahan atau sebaliknya) mencetak nama kelas dan/atau ID objek.

Last but not least, tes menulis adalah alat desain yang mengungkap potensi masalah dalam aplikasi Anda. Anda mungkin ingin bertanya pada diri sendiri mengapa hasil toString() tidak cocok untuk dicetak dalam laporan dan memfaktorkan ulang metode tersebut. Mungkin metode toString() Anda menggunakan jeda baris dan harus disederhanakan untuk mencetak representasi objek satu baris. Mungkin Anda ingin memfaktorkan representasi multi-baris ke dalam metode lain dan/atau memiliki serangkaian metode terkait seperti toString(), toShortString(), toLongString() (semua terlihat di API sebelumnya) atau mungkin sesuatu yang spesifik seperti toMultiLineString().


Pembaruan setelah OP mengubah pertanyaan secara signifikan:

Jika pengguna ekstensi Anda merasa bahwa laporannya tidak cukup jelas, dia dapat menambahkan kolom userType ke tabel data, yang berisi nilai seperti "15 tahun".

Atau mungkin lebih sederhana, cukup tambahkan kolom age dengan nilai seperti 15, 18, 19, 40 dan buat instance pengguna secara langsung melalui instantiateUserByAge(age) di kolom user atau di given pengujian bagian daripada membuat banyak variabel statis. Nilai age akan dilaporkan oleh ekstensi Anda. Dalam kombinasi dengan nama metode fitur yang tidak digulung menggunakan #age ini harus cukup jelas.

Apakah membuat pengguna sangat mahal sehingga Anda harus memasukkannya ke dalam variabel statis? Anda ingin menghindari statika jika tidak benar-benar diperlukan karena mereka cenderung menghilangkan efek samping pada tes lain jika objek tersebut bisa berubah dan keadaan internalnya berubah dalam satu tes, mis. karena seseorang dengan mudah menggunakan userAge15 untuk menguji setAge(int). Cobalah untuk menghindari optimasi prematur melalui variabel statis yang seringkali hanya menghemat mikrodetik. Bahkan jika Anda memutuskan untuk membuat set pengguna sebelumnya dan menggunakannya kembali di semua pengujian, Anda dapat memasukkannya ke dalam peta dengan usia sebagai kuncinya dan dengan mudah mengambilnya dari metode fitur Anda, sekali lagi hanya menggunakan usia di tabel data sebagai nilai input untuk query peta, baik secara langsung maupun melalui metode helper.

Intinya: Saya pikir Anda tidak perlu mengubah ekstensi Anda untuk melayani pengguna yang menulis tes buruk. Pengguna tersebut harus belajar bagaimana menulis tes yang lebih baik. Sebagai efek samping, laporan juga akan terlihat lebih komprehensif. 😀

1
kriegaex 21 November 2020, 02:24