Vieno bandymo C kodas

Šią vasarą dirbau įterptinėje sistemoje, parašyta tiesiogiai C. Tai buvo esamas projektas, kuriame dirbau. Buvau gana paprasta rašyti vieneto testus „Java“ naudodamas „JUnit“, bet buvau nuostolinga dėl geriausio būdo, kaip parašyti esamų kodų vienetų testus (kuriems reikėjo refaktoravimo), taip pat naują sistemą, pridėtą prie sistemos.

Ar yra būdas padaryti vieneto testą paprastą C kodą taip paprasta, kaip vieneto testavimo Java kodą, pavyzdžiui, JUnit? Bet koks supratimas, kuris būtų naudojamas specialiai įterptinei plėtrai (kryžminis kompiliavimas į arm-linux platformą), būtų dėkingas.

768
15 сент. nustatė Paulius Osborne 15 sept. 2008-09-15 22:12 '08 10:12 val. 2008-09-15 22:12
ответ 31 atsakymų
  • 1
  • 2

Vienas iš vieneto bandymų C pagrindu yra patikrinimas ; C skyriuje pateikiamas vieneto testavimo sistemų sąrašas pateikiamas čia ir pateikiamas toliau. Priklausomai nuo to, kiek standartinių bibliotekos funkcijų veikia jūsų vykdymo aplinka, galite arba negalėsite naudoti vieno iš jų.

Aceunitas

„AceUnit“ („Advanced C“ ir „Embedded Unit“) yra patogi C kodo testavimo aplinka, kuri bando imituoti JUnit 4.x ir apima tokias funkcijas kaip atspindys. „AceUnit“ gali būti naudojama aplinkose su ribotais ištekliais, pavyzdžiui, kuriant įterptąją programinę įrangą, ir, svarbiausia, ji veikia gerai aplinkose, kuriose negalite įtraukti vieno standartinio antraštės failo ir negali skambinti vienu standartinės C funkcijos iš ANSI / ISO bibliotekų C. Ji taip pat turi „Windows“ prievadą. Jis nenaudoja kištukų signalams užfiksuoti, nors autoriai parodė susidomėjimą pridėti tokią funkciją. Žr. „ AceUnit“ pagrindinį puslapį .

GNU Autounit

Panašiai kaip ir „Check“, įskaitant ir atskirų adresų erdvėje atliekamų vieneto testų sujungimą (iš tikrųjų originalus autorius Check pasiskolino idėją iš GNU Autounit). „GNU Autounit“ plačiai naudoja „GLib“, o tai reiškia, kad susiejimui ir pan. Reikalingos specialios parinktys, tačiau tai gali būti ne didelė problema, ypač jei jau naudojate „GTK“ ar „GLib“. Žr. GNU Autounit pagrindinį puslapį .

Kunite

Taip pat naudoja „GLib“, tačiau nepadengia vieneto bandymų adresų vietos.

Kunite

C standartas, su planais įgyvendinti Win32 GUI. Šiuo metu nėra šakotas arba kitaip apsaugo vieneto testų adresų erdvę. Plėtros pradžioje. Žr. CUnit pagrindinį puslapį .

gražus

Paprasta struktūra su viena .c ir viena .h byla, kurią vilkite į šaltinio medį. Žr. „ CuTest“ pagrindinį puslapį .

Cppunit

Pagrindinė C ++ vienetų bandymo sistema; Taip pat galite ją naudoti C kodui patikrinti, jis yra stabilus, aktyviai sukurtas ir turi grafinę sąsają. Pagrindinės priežastys, kodėl nenaudojamos CppUnit C: pirmiausia yra gana didelės, antra, turite parašyti savo bandymus C + +, o tai reiškia, kad jums reikia C ++ kompiliatoriaus. Jei tai neatrodo problema, tai tikrai verta apsvarstyti, kartu su kitomis C + + modulinių bandymų sistemomis. Žr. „ CppUnit“ pagrindinį puslapį .

embUnit

embUnit (Embedded Unit) yra kita integruotų sistemų vieneto testavimo infrastruktūra. Atrodo, kad tai pakeis AceUnit. Įterpto bloko pagrindinis puslapis .

MinUnit

Mažiausias makrokomandų rinkinys ir visi! Esmė yra parodyti, kaip paprasta atlikti kodo testavimą. Žr. „ MinUnit“ pagrindinį puslapį .

Užblokuokite p. Ando

„CUnit“, kuris yra gana naujas ir akivaizdžiai vis dar ankstyvuose vystymosi etapuose, įgyvendinimas. Žr. „ CUnit“ p. Ando pagrindiniame puslapyje .

Šis sąrašas paskutinį kartą buvo atnaujintas 2008 m. Kovo mėn.

Daugiau rėmelių:

CMocka

CMocka yra C aplinka, palaikanti manekeno objektus. Tai lengva naudoti ir konfigūruoti.

Žr. „ CMocka“ pagrindinį puslapį .

kriterijus

Kriterijus yra kompleksinė vieneto testavimo infrastruktūra C, kuri palaiko automatinę bandymų registraciją, parametrinius testus, teorijas ir gebėjimą perduoti duomenis keliais formatais, įskaitant TAP ir JUnit XML. Kiekvienas bandymas atliekamas pagal savo procesą, todėl signalus ir gedimus galima pranešti arba išbandyti, jei reikia.

Daugiau informacijos rasite „ Criteria“ pagrindiniame puslapyje .

Hwut

„HWUT“ yra bendrinis vieneto testavimo įrankis su puikiu „C“ palaikymu, kuris gali padėti sukurti „Make files“, generuoti masinius bandymų atvejus, koduotus minimaliomis „iteracijos lentelėmis“, vaikščioti per ribines valstybės mašinas, generuoti „C-stub“ ir kt. Bendras požiūris yra gana unikalus: nuosprendžiai grindžiami „geru stdout / bad stdout“. Tačiau palyginimo funkcija yra lanksti. Taigi tikrinimui galima naudoti bet kokį scenarijų tipą. Tai gali būti taikoma bet kuriai kalbai, kuri gali sukurti standartinę išvestį.

Žr. HWUT pagrindinį puslapį .

Cgreen

Moderni, nešiojama, daugiakalbė modulinė C ir C ++ testavimo ir modeliavimo sistema. Jis siūlo papildomą BDD žymėjimą, bibliotekos išdėstymą, galimybę jį paleisti viename procese (lengviau derinti). Yra bandymų bėgikas, kuris automatiškai aptinka bandymo funkcijas. Tačiau galite sukurti savo programinę įrangą.

Visos šios funkcijos (ir daugiau) yra aprašytos CGreen vadove .

Vikipedija pateikia išsamų vieneto testavimo platformų sąrašą skyriuje „ Vieneto testavimo platformos sąrašas: C

439
15 сент. atsakymą pateikė Adam Rosenfield 15 sep . 2008-09-15 22:14 '08 10:14 val. 2008-09-15 22:14

Asmeniškai man patinka „ Google“ testų sistema .

Tikrasis C kodo sudėtingumas nutraukia priklausomybę nuo išorinių modulių, todėl galite atskirti kodą vienetais. Tai gali būti ypač problemiška, kai bandote gauti pasenusio kodo bandymus. Tokiu atveju dažnai naudoju nuorodą, kad bandymuose būtų naudojamos stubo funkcijos.

Tai yra tai, ką žmonės kalba apie tai, kada jie kalba apie siūles . C vienintelė jūsų galimybė yra naudoti išankstinį procesorių arba jungiklį priklausomybių išskyrimui.

Tipinis bandymų rinkinys viename iš mano C projektų gali atrodyti taip:

 #include "myimplementationfile.c" #include <gtest/gtest.h> // Mock out external dependency on mylogger.o void Logger_log(...){} TEST(FactorialTest, Zero) { EXPECT_EQ(1, Factorial(0)); } 

Atkreipkite dėmesį, kad iš tikrųjų įtraukiate C failą, o ne antraštės failą . Tai suteikia pranašumą prieigai prie visų statinių duomenų elementų. Čia aš išgąsčiau savo registratorių (kuris gali būti logger.o ir suteikia tuščią įgyvendinimą. Tai reiškia, kad bandymo failas yra sukompiliuotas ir susietas nepriklausomai nuo likusios kodo bazės ir veikia atskirai.

border=0

Dėl kryžminio sudarymo kodo šiam tikslui jums reikia gerų objektų. Tai padariau naudojant „googletest“ kryžių, sukurtą „Linux“ „PowerPC“ architektūroje. Tai yra prasminga, nes jūs turite pilną apvalkalą ir os surinkti savo rezultatus. Jei naudojate mažiau turtingą aplinką (kurią klasifikuoju, kaip jums patinka be pilnos OS), turėtumėte tiesiog sukurti ir paleisti kompiuterį. Vis dėlto turite tai padaryti, kad bandymai būtų automatiškai paleisti kaip dalis pastato.

Manau, kad C + + kodai paprastai yra daug lengviau, nes OO kodas apskritai yra daug mažiau susijęs su procedūriniu (žinoma, jis labai priklauso nuo kodavimo stiliaus). Be to, C ++ galite naudoti tokius gudrybės kaip priklausomybės injekcija ir nepaisyti metodo, kad galėtumėte gauti siūles į kodą, kuris yra kitaip įdėtas.

Michael Feathers turi jį . Viename skyriuje jis aprašo metodus, kaip dirbti su kodu, o ne OO, kuriuos labai rekomenduoju.

Keisti . Aš parašiau vieneto testavimo ataskaitą šaltinio, esančio „GitHub“ .

Keisti . Aš labai rekomenduoju .

143
11 сент. Atsakymą pateikė mikelong Sep 11 2009-09-11 13:19 '09, 13:19, 2009-09-11 13:19

Minunitas yra neįtikėtinai paprasta modulinė testavimo sistema. Aš naudoju jį vieneto testo c mikrokontrolerio kodui avr.

124
15 сент. Matteo Caprari atsakymas rugsėjo 15 d 2008-09-15 22:27 '08, 22:27 pm 2008-09-15 22:27

Šiuo metu naudojasi CuTest vieneto bandymų sistema:

http://cutest.sourceforge.net/

Jis idealiai tinka įterptoms sistemoms, nes jis yra labai lengvas ir paprastas. Aš neturėjau problemų su savo darbu tikslinėje platformoje ir darbalaukyje. Be vieneto testų rašymo, viskas reikalinga:

  • antraštės failas yra įtrauktas visur, kur skambinate „CuTest“
  • vienas papildomas failas „C“, kuris turi būti kompiliuojamas / susietas su vaizdu
  • kai kurie paprastieji kodai, pridėti prie pagrindinio, kad sukonfigūruotų ir skambintų vieneto testus - aš tiesiog tai naudoju specialioje pagrindinėje () funkcijoje, kuri yra sukompiliuota, jei kūrimo metu nustatoma UNITTEST.

Sistema turi palaikyti krūvą ir kai kurias stdio funkcijas (kurios nėra visos įterptinės sistemos). Tačiau kodas yra pakankamai paprastas, kad galbūt dirbate alternatyvomis šiems reikalavimams, jei jūsų platforma jų nėra.

Naudojant tam tikrą protingą „C“ {} blokų naudojimą, jis taip pat palaiko C ++ testavimą.

39
16 сент. Michael Burr atsakymas rugsėjo 16 d 2008-09-16 21:00 '08 21:00 val. 2008-09-16 21:00

Aš kalbu beveik tokį patį kaip ratkok, bet jei turite įmontuotą pasukimą vieneto testams, tada ...

Vienybė - labai rekomenduojamas pagrindas C kodo vieneto testavimui.

Knygos pavyzdžiai, kurie šiame TDD sraute yra nurodyti įterptam C, yra parašyti naudojant Unity (ir CppUTest).

34
08 нояб. atsakymą pateikė Johan 08 Nov. 2011-11-08 11:40 '11, 11:40, 2011-11-08 11:40

Taip pat galite pažvelgti į „ libtap“ , „C“ testavimo sistemą, iš kurios gaunamas „Test Anything Protocol“ (TAP) protokolas, ir taip gerai integruojasi su įvairiomis šios technologijos priemonėmis. Jis daugiausia naudojamas dinamiškame kalbos pasaulyje, tačiau jį lengva naudoti ir jis tampa labai populiarus.

Pavyzdys:

 #include <tap.h> int main () { plan(5); ok(3 == 3); is("fnord", "eek", "two different strings not that way?"); ok(3 <= 8732, "%d <= %d", 3, 8732); like("fnord", "f(yes|no)r*[af]$"); cmp_ok(3, ">=", 10); done_testing(); } 
30
16 сент. Atsakymas pateikiamas Ovid rugsėjo 16 d 2008-09-16 09:32 '08 at 9:32 2008-09-16 09:32

Yra elegantiška modulinė testavimo platforma C, palaikanti mocc objektus, vadinamus cmocka . Tam reikalinga tik standartinė C biblioteka, veikia keliose skaičiavimo platformose (įskaitant įterptąsias) ir skirtingiems kompiliatoriams.

Jis taip pat palaiko įvairius pranešimų išvesties formatus, pvz., Subunit, Test Anything Protocol ir jUnit XML ataskaitas.

cmocka buvo sukurta dirbti įterptose platformose, taip pat turi „Windows“ palaikymą.

Paprastas testas yra toks:

 #include <stdarg.h> #include <stddef.h> #include <setjmp.h> #include <cmocka.h>  static void null_test_success(void **state) { (void) state;  } int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(null_test_success), }; return cmocka_run_group_tests(tests, NULL, NULL); } 

API yra pilnai dokumentuota ir keli pavyzdžiai yra šaltinio kodo dalis.

Norėdami pradėti su cmocka, turėtumėte perskaityti straipsnį apie „LWN.net“: Vieneto testavimas su „Mock“ objektais C

cmocka 1.0 išleista 2015 m. vasario mėn.

26
20 янв. atsakymas pateikiamas sausio 20 d 2013-01-20 16:43 '13, 16:43, 2013-01-20 16:43

Prieš pradėdamas ieškoti būdų, kaip paslėpti ypatybes, aš neužgavau senos C paraiškos testavimo. Aš turėjau nuslėpti C failą, kurį noriu patikrinti su kitais. Aš išbandžiau, ir manau, kad galiu jį priimti.

„Cmock“ nuskaito antraštės failus ir sukuria išdėstymo funkcijas, remdamasi nustatytais prototipais. „Mocks“ leis jums išbandyti C failą puikia izoliacija. Viskas, ką jums reikia padaryti, yra susieti savo bandomąjį failą su „mocks“ vietoj realių objekto failų.

Kitas „cmock“ privalumas yra tas, kad jis patikrins, kokie parametrai perduodami patyčias patiriančioms funkcijoms, ir tai leis jums nurodyti, kokią grįžtamąją vertę turi pateikti atramos. Tai labai naudinga bandant įvairias temas jūsų funkcijose.

Testai susideda iš tipinių funkcijų testA (), testB (), kuriame sukuriate lūkesčius, skambinate funkcijomis, kad patikrintumėte ir patvirtintumėte teiginius.

Paskutinis žingsnis yra sukurti bandymus su vienybe. Cmock yra susietas su vienybės tikrinimo rėmeliu. Vienybė yra taip paprasta išmokti kaip ir bet kuri kita vieneto bandymo infrastruktūra.

Verta pabandyti ir gana lengvai suprantama:

http://sourceforge.net/apps/trac/cmock/wiki

Atnaujinti 1

Kita struktūra, kurią studijuoju, yra Cockockery.

http://code.google.com/p/cmockery/

Tai gryna C platforma, kuri palaiko vieneto bandymus ir patyčias. Tai neturi nieko bendro su rubinu (priešingai Cmock), ir tai labai mažai priklauso nuo išorinių libų.

„Mocks“ nustatymas reikalauja šiek tiek daugiau rankinio darbo, nes nesukuria kodo. Tai nereiškia daug darbo esamam projektui, nes prototipai daug nepasikeis: jei turite savo išdėstymą, jums nereikės jų tam tikrą laiką keisti (tai yra mano atvejis). Papildoma paminkštinimo sistema užtikrina pilną valdymą. Jei jums nepatinka kažkas, tiesiog pakeiskite savo išdėstymą.

Nereikia specialaus testerio. Jums reikia tik sukurti testų masyvą ir perduoti jį „run_tests“ funkcijai. Štai šiek tiek daugiau rankinio darbo, bet aš tikrai mėgstu savarankiškos autonominės struktūros idėją.

Be to, jame yra keletas elegantiškų triukų, kurių nežinojau.

Paprastai „Cmockery“ reikalauja šiek tiek daugiau supratimo apie išdėstymus, kad galėtumėte pradėti. Pavyzdžiai padės jums tai įveikti. Atrodo, kad jis gali susidoroti su paprastesne mechanika.

20
22 июля '10 в 16:03 2010-07-22 16:03 Atsakymą pateikė Philippe A. Liepos 22 d., 10 d., 4:03 val. 2010-07-22 16:03

Kaip „C“ naujokė, labai naudinga rasti „C“ kūrinius, vadinamus „ Test powered development“ . Iš esmės jis naudoja standartinį assert() su > , kad gautų pranešimą be jokių išorinių priklausomybių. Jei kas nors naudojamas užbaigti kamino patikrinimą, tai tikriausiai nebus :)

15
09 окт. atsakymas chelmertz 09 oct. 2011-10-09 02:10 '11 at 2:10 2011-10-09 02:10

Yra cuit

Be to, įterptinis modulis yra įterptųjų C sistemų modulinė testavimo sistema, kurios dizainas buvo nukopijuotas iš „JUnit“ ir „CUnit“ ir dar daugiau, o po to šiek tiek pritaikytas įterptinei C sistemai. Įterptųjų įrenginių nereikia std C libs. Visi objektai yra pasirinkti pastoviam regionui.

Tessy automatizuoja integruotos programinės įrangos vieneto testavimą.

12
15 сент. Atsakymas pateikiamas prakash 15 Sep. 2008-09-15 22:27 '08, 22:27 pm 2008-09-15 22:27

Mes parašėme CHEAT (paskelbtą „ GitHub“ ), kad galėtume naudoti ir perkelti.

Ji neturi priklausomybės ir nereikalauja diegimo ar konfigūracijos. Reikia tik antraštės failo ir bandymo atvejo.

 #include <cheat.h> CHEAT_TEST(mathematics_still_work, cheat_assert(2 + 2 == 4); cheat_assert_not(2 + 2 == 5); ) 

Bandymai sukompiliuojami į vykdomąjį failą, kuris rūpinasi bandymų vykdymu ir praneša apie jų rezultatus.

 $ gcc -I . tests.c $ ./a.out .. --- 2 successful of 2 run SUCCESS 

Jis taip pat turi gražių spalvų.

12
03 окт. Atsakymą duoda Tuplanolla 03 d. 2014-10-03 20:14 '14 at 20:14 2014-10-03 20:14

Nenaudojau sistemos, tiesiog naudoju automatinio tikrinimo tikslinę paramą. Užpildykite „pagrindinį“ ir naudokite patvirtinimą (-us).

Mano testo Makefile.am (-ų) failas atrodo taip:

 check_PROGRAMS = test_oe_amqp test_oe_amqp_SOURCES = test_oe_amqp.c test_oe_amqp_LDADD = -L$(top_builddir)/components/common -loecommon test_oe_amqp_CFLAGS = -I$(top_srcdir)/components/common -static TESTS = test_oe_amqp 
11
16 сент. atsakymas pateikiamas Navicore 16 sept. 2008-09-16 16:54 '08 at 4:54 pm 2008-09-16 16:54

Michael Peros knygoje „Efektyviai dirbantis su palikimu“ pateikiami įvairūs metodai, būdingi vieneto testavimui C kūrimo metu.

Yra būdų, susijusių su priklausomybės injekcijomis, kurios būdingos C, kurių niekur kitur nemačiau.

11
11 сент. Atsakymą pateikė Frank Schwieterman 11 sep . 2009-09-11 22:21 '09 10:21 val. 2009-09-11 22:21

CppUTest - labai rekomenduojama C kodo vieneto testavimo struktūra.

Knygos pavyzdžiai, kurie šiame TDD sraute yra nurodyti įterptam C , įrašomi naudojant „CppUTest“.

7
07 июня '11 в 21:46 2011-06-07 21:46 atsakymas pateikiamas ratko birželio 7 d. 11 d. 21:46 2011-06-07 21:46

išskyrus mano akivaizdų šališkumą

http://code.google.com/p/seatest/

- geras paprastas būdas atlikti vieneto bandymo kodą C. Simuliuoja xUnit

6
01 июля '10 в 8:09 2010-07-01 08:09 atsakė Keith Nicholas liepos 1 d. 10 d. 8:09 2010-07-01 08:09

Naudoju CxxTest C / C + + integruotoje aplinkoje (pirmiausia C ++).

Aš norėčiau CxxTest, nes jis turi perl / python scenarijų, kad būtų sukurtas testo bėgikas. Po nedidelio pakreipimo, kad jį būtų galima sureguliuoti (mažesnis, nes nereikia rašyti testo bėgiko), tai gana paprasta naudoti (įskaitant pavyzdžius ir naudingą dokumentaciją). Dauguma darbų apėmė „aparatūros“ prieigos prie kodo sukūrimą, kad galėčiau veiksmingai išbandyti modulį / modulį. Po to lengva pridėti naujus vieneto bandymo atvejus.

Kaip minėta anksčiau, tai yra C / C + + vieneto testas. Todėl jums reikės C ++ kompiliatoriaus.

„CxxTest CxxTest Wiki“ vartotojo vadovas

6
16 сент. Atsakymas pateiktas Zing- 16 Sep. 2008-09-16 01:47 '08 at 1:47 2008-09-16 01:47

Perskaičius Minunitą, maniau, kad geriausias būdas yra pagrįstas makrokomandų testas, kurį daug naudoju kaip apsaugos programos techniką. Taigi naudoju tą pačią idėją kaip ir Minunitas, sumaišytas su standartiniu pareiškimu. K0ga dienoraštyje galite pamatyti mano struktūrą (geras vardas gali būti „NoMinunit“)

5
18 февр. Atsakymą pateikė Roberto Vargas Caballero vasario 18 d. 2011-02-18 23:38 '11 11:38 val. 2011-02-18 23:38

„Cmockery“ yra naujai pradėtas projektas, kurį sudaro labai paprasta naudoti C biblioteka vienetų testams rašyti.

4
16 сент. Alejandro Bologna atsakymas, pateiktas rugsėjo 16 d. 2008-09-16 18:40 '08 18:40 pm 2008-09-16 18:40

„Google“ turi puikią testavimo sistemą. https://github.com/google/googletest/blob/master/googletest/docs/primer.md

Ir taip, kiek galiu matyti, jis veiks su paprasta C, ty nereikalauja C ++ funkcijų (gali būti reikalingas C ++ kompiliatorius, nežinomas).

4
15 сент. Paweł Hajdan atsakymas rugsėjo 15 d 2008-09-15 22:14 '08 10:14 val. 2008-09-15 22:14
4
15 сент. Atsakymą pateikė Landon Kuhn . 2008-09-15 22:22 '08, 22:22 pm 2008-09-15 22:22

Pirmiausia žiūrėkite čia: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C

Mano įmonėje yra C biblioteka, kurią naudoja mūsų klientai. Kodą išbandyti naudojame CxxTest (C ++ vieneto bandymų biblioteka). „CppUnit“ taip pat veiks. Jei esate įstrigę C, rekomenduoju RCUNIT (bet CUnit taip pat gerai).

3
15 сент. Kevino rugsėjo 15 d. Atsakymas 2008-09-15 23:39 '08 at 11:39 2008-09-15 23:39

Prieš bandydamas tikslą, aš naudoju RCUNIT, kad galėčiau atlikti kai kuriuos kompiuterio integruoto kodo testus. Geras techninės įrangos sąsajos abstrakcija yra svarbi, kad kiti baigtiniai elementai ir atminties žemėlapiai užmuštų jus.

2
25 нояб. Atsakymą pateikė Gerhard . 2008-11-25 14:12 '08, 14:12 pm, 2008-11-25 14:12

pabandykite lcut! - http://code.google.com/p/lcut

2
10 окт. Tony Bai atsakymas spalio 10 d. 2010-10-10 04:43 '10, 4:43, 2010-10-10 04:43

API Sanity Checker - тестовая среда для библиотек C/С++: