Perbandingan kerangka uji unit C ++ [ditutup]

300

Saya tahu sudah ada beberapa pertanyaan mengenai rekomendasi untuk kerangka uji unit C ++, tetapi semua jawaban tidak membantu karena mereka hanya merekomendasikan salah satu kerangka kerja tetapi tidak memberikan informasi apa pun tentang perbandingan (fitur).

Saya pikir kerangka kerja yang paling menarik adalah CppUnit, Boost dan kerangka pengujian Google yang baru. Adakah yang sudah melakukan perbandingan?

pembantu rumah tangga
sumber
2
kemungkinan duplikat pengujian Unit untuk kode C ++ - Alat dan metodologi
HaskellElephant
Saya memiliki kerangka pengujian berbasis IOC sendiri yang lebih saya sukai karena itu bukan hanya tiruan dari apa yang dilakukan orang lain, tetapi juga mengatasi apa yang saya temukan sebagai masalah bagi orang lain. Anda menulis kasus uji dengan berasal dari kelas, bukan dengan menggunakan makro. Makro hanya digunakan untuk pernyataan saat mereka memberi Anda refleksi. Output khusus dari statistik pengujian. Jalankan dari skrip IOC sehingga Anda memilih apa yang Anda uji, seberapa sering dan dengan parameter apa.
CashCow
dan itu brilian dari sudut pandang pengembangan seperti ketika saya menambahkan tes saya sendiri saya bisa menjalankannya tanpa harus menjalankan semua orang pada saat yang sama. Jadi saya tahu bahwa kode saya berfungsi.
CashCow

Jawaban:

99

Lihat pertanyaan ini untuk beberapa diskusi.

Mereka merekomendasikan artikel: Menjelajahi C ++ Jungle Framework Pengujian , Oleh Noel Llopis. Dan yang terbaru: Kerangka Kerja Unit Tes C ++

Saya belum menemukan artikel yang membandingkan googletest dengan kerangka kerja lainnya.

Sam Saffron
sumber
Seperti yang saya tulis: semua jawaban hanya merekomendasikan salah satu kerangka kerja tetapi tidak membandingkan kerangka kerja dengan yang lain.
pembantu rumah tangga
Anda juga tidak senang dengan artikel itu?
Gishu
7
Satu kritik: artikelnya, meski bagus, berasal dari 2004 dan tidak menyertakan Uji Google.
richq
2
Di tautan pertama Anda akan melihat dua perbandingan. Kecuali kerangka kerja baru dari google, sebagian besar informasi masih relevan. (Dan CppUnit bukan yang paling menarik, terlalu canggung untuk digunakan)
Luc Hermitte
1
memperbaiki tautan dan memperluas jawabannya dengan perbandingan yang lebih baru
Sam Saffron
120

Seorang pemain baru adalah Google Test (juga dikenal sebagai Google C ++ Testing Framework ) yang cukup bagus.

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Fitur utama:

  • Portable
  • Pernyataan fatal dan non-fatal
  • Pesan informatif yang mudah ditegaskan :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test secara otomatis mendeteksi tes Anda dan tidak mengharuskan Anda untuk menghitungnya untuk menjalankannya
  • Buatlah mudah untuk memperpanjang kosakata penegasan Anda
  • Tes kematian (lihat panduan lanjutan)
  • SCOPED_TRACE untuk loop subrutin
  • Anda dapat memutuskan tes mana yang akan dijalankan
  • Pembuatan laporan pengujian XML
  • Jadwal / Mock / Template ...
Wernight
sumber
3
Saya sangat menikmati menggunakan uji google atas beberapa kerangka kerja lainnya terutama dengan kemampuan mengejeknya yang dapat ditemukan dalam kerangka kerja googlemock.
Mike
8
Saya menyediakan semua fitur ini (walaupun beberapa belum publik) dan lebih banyak lagi dalam kerangka pengujian baru saya, CATCH. Lihat jawaban saya untuk tautan.
philsquared
2
menggabungkannya dengan Google C ++ Mocking framework membuatnya sangat kuat untuk kerangka uji xUnit untuk unit test C ++ code.
ratkok
5
@CashCow Menjalankan dengan build adalah sesuatu yang berbeda dari deteksi tes. Menjalankan dengan build tergantung pada sistem build Anda. Deteksi tes berarti Anda tidak harus membuat daftar semua tes di kelas lain, cukup buat metode tes dan hanya itu.
Wernight
Saya tidak suka makro mereka terlalu sering digunakan, dan fakta bahwa menggunakan kata-kata umum seperti TEST yang mungkin berbenturan dengan sesuatu. GTEST akan lebih baik, lebih kecil kemungkinannya untuk berbenturan.
CashCow
112

Saya baru saja mendorong kerangka kerja saya sendiri, CATCH , di luar sana. Ini masih dalam pengembangan tetapi saya percaya itu sudah melampaui sebagian besar kerangka kerja lainnya. Orang yang berbeda memiliki kriteria yang berbeda tetapi saya telah mencoba untuk menutupi sebagian besar tanpa terlalu banyak pertukaran. Lihatlah entri blog saya yang terhubung untuk pencicip. Lima fitur utama saya adalah:

  • Hanya judul
  • Registrasi otomatis berdasarkan tes fungsi dan metode
  • Menguraikan ekspresi C ++ standar menjadi LHS dan RHS (jadi Anda tidak perlu seluruh keluarga makro pernyataan).
  • Dukungan untuk bagian bersarang dalam fixture berbasis fungsi
  • Tes nama menggunakan bahasa alami - nama fungsi / metode dihasilkan

Ini juga memiliki binding Objective-C. Proyek ini di-host di Github

philsquared
sumber
Silakan pertimbangkan untuk menambahkan CHECK_FLASEdan REQUIRE_FLASEmakro.
Emile Cormier
6
Kerangka kerja terbaik menurut saya.
CoffeDeveloper
3
doctest adalah implementasi ulang saya dari Catch dengan fokus besar pada kecepatan kompilasi - memeriksa FAQ untuk melihat perbedaannya
onqtam
@einpoklum Catch tidak ditinggalkan - pembuatnya sedang mengerjakan versi 2 perpustakaan. doctest adalah semacam implementasi ulang Catch 1 dengan beberapa keputusan desain bonus
onqtam
2
Saya benar-benar bingung ketika membandingkan semua kerangka kerja pengujian (salah satunya sekarang saya harus memilih). Apakah Anda akan menulis jawaban Anda sendiri membandingkan dan membandingkan dokumen dengan Catch dan penawaran lainnya?
einpoklum
53

Boost Test Library adalah pilihan yang sangat baik terutama jika Anda sudah menggunakan Boost.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

Ini mendukung:

  • Pendaftaran tes otomatis atau manual
  • Banyak pernyataan
  • Perbandingan koleksi secara otomatis
  • Berbagai format output (termasuk XML )
  • Perlengkapan / Template ...

PS: Saya menulis sebuah artikel tentang hal itu yang dapat membantu Anda memulai: C ++ Kerangka Pengujian Unit: Tutorial Tes Peningkatan

Wernight
sumber
Saya biasa menggunakan tes Boost dan menyukainya kecuali bahwa itu tampaknya berubah secara signifikan antara rilis. Cukup sulit menjual unit testing kepada klien saya tanpa harus menghabiskan lebih banyak waktu (dan uang mereka) untuk memperbaiki tes ketika API berubah, daripada memperbaiki kode yang seharusnya diuji. Pada akhirnya saya membuangnya dan menulis sendiri - ini sekitar 5 tahun yang lalu.
Komponen 10
5
Tautan tutorial rusak
mloskot
2
@mloskot Berhasil lagi.
Chris Jester-Young
@mloskot Maaf untuk itu, silakan kirim saya email langsung jika Anda melihatnya rusak. Mudah ditemukan daripada komentar. :)
Wernight
@ Wightight Yup, bekerja lagi. Thx
mloskot
16

Saya baru-baru ini merilis xUnit ++ , khususnya sebagai alternatif untuk Google Test dan Boost Test Library (lihat perbandingannya ). Jika Anda terbiasa dengan xUnit.Net, Anda siap untuk xUnit ++.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

Fitur utama:

  • Sangat cepat: tes berjalan bersamaan .
  • Portable
  • Registrasi tes otomatis
  • Banyak tipe pernyataan (Tidak ada peningkatan di xUnit ++)
  • Membandingkan koleksi secara asli.
  • Pernyataan muncul dalam tiga tingkatan:
    • kesalahan fatal
    • kesalahan tidak fatal
    • peringatan
  • Mudah menegaskan logging:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Uji logging:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Perlengkapan
  • Tes berbasis data (Teori)
  • Pilih tes yang akan dijalankan berdasarkan:
    • Pencocokan atribut
    • Beri nama substring matchin
    • Suites Uji
moswald
sumber
2
Pertanyaannya adalah meminta perbandingan. IMO, sangat penting untuk menyajikan apa perbedaan antara kerangka kerja Anda dan, setidaknya, dua yang populer: googletest dan Boost. Terutama, jika Anda mengiklankan xUnit ++ sebagai alternatif untuk keduanya. Akan diberi +1 jika diperbarui :)
mloskot
Cukup adil. :) Saya sudah punya tabel perbandingan di wiki , tetapi saya akan mencoba meringkas beberapa perbedaan secara langsung dalam jawaban saya.
Moswald
1
Saya memutuskan untuk hanya menautkan tabel wiki secara langsung, itu mengacaukan ringkasan untuk mendaftar semuanya.
moswald
tautannya berfungsi untuk saya, terima kasih! +1
mloskot
1
Sudahkah proyek Anda dihentikan? Tanggal komit terakhir kembali ke 09/2015 ... Pokoknya, jawaban yang bagus. Terima kasih.
zertyz
5

CppUTest - sangat bagus, kerangka kerja ringan dengan perpustakaan tiruan. Bermanfaat untuk melihat lebih dekat.

ratkok
sumber
4

CPUnit ( http://cpunit.sourceforge.net ) adalah kerangka kerja yang mirip dengan Google Test, tetapi yang bergantung pada lebih sedikit makro (menegaskan fungsi), dan di mana makro diawali untuk menghindari perangkap makro yang biasa. Tes terlihat seperti:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

Mereka mendaftar otomatis, jadi Anda tidak perlu lebih dari ini. Kemudian hanya kompilasi dan jalankan. Saya menemukan menggunakan kerangka kerja ini sangat mirip dengan menggunakan JUnit, bagi mereka yang harus menghabiskan waktu pemrograman Java. Sangat bagus!

Roger
sumber
2

API Sanity Checker - kerangka uji untuk pustaka C / C ++:

Generator otomatis pengujian unit dasar untuk pustaka C / C ++ bersama. Ia mampu menghasilkan input data yang masuk akal (dalam kebanyakan, tetapi sayangnya tidak semua kasus) parameter dan menyusun kasus uji sederhana ("kewarasan" atau "kualitas dangkal") untuk setiap fungsi dalam API melalui analisis deklarasi di header file.

Kualitas tes yang dihasilkan memungkinkan untuk memeriksa tidak adanya kesalahan kritis dalam kasus penggunaan sederhana. Alat ini mampu membangun dan menjalankan tes yang dihasilkan dan mendeteksi crash (segfault), batal, semua jenis sinyal yang dipancarkan, kode pengembalian program yang tidak nol dan program menggantung.

Fitur unik dibandingkan dengan CppUnit, Boost dan Google Test:

  • Pembuatan data uji dan argumen input otomatis (bahkan untuk tipe data kompleks)
  • Modern dan sangat dapat digunakan kembali jenis khusus bukan perlengkapan dan template
linuxbuild
sumber