Scopri come testare i tuoi esercizi Arturo su Exercism
La traccia Arturo usa il pacchetto per i test unitari Unitt 3.0.0 per tutti i test degli esercizi.
Questo pacchetto fornisce un framework di test che supporta sia la sintassi moderna ispirata a RSpec sia quella legacy ispirata a XUnit.
Eseguire arturo tester.art o exercism test dalla cartella locale dell'esercizio dovrebbe installare il pacchetto da Internet alla prima esecuzione.
In alternativa, puoi installare Unitt eseguendo arturo --package install unitt 3.0.0.
Verrà eseguito e riportato solo il primo test.
Quando quel test passa, riattiva il successivo ed esegui di nuovo i test, finché non passano tutti.
Sia per la configurazione RSpec sia per quella XUnit, basta rimuovere .skip da it.skip o da test.skip rispettivamente.
Quando tutti i test passano, invia la soluzione, ma tieni presente che il test runner esegue tutti i test, anche quelli saltati.
La cartella dell'esercizio che hai scaricato contiene diversi file, ma questi tre sono quelli essenziali.
leap/
├── src/leap.art # Your solution file
├── tests/test-leap.art # Test cases for the exercise
└── tester.art # Test runner entry point
Eseguire arturo tester.art configura Unitt e poi esegue i test dentro tests/test-leap.art.
I test importeranno src/leap.art, che contiene la soluzione, e poi faranno una serie di affermazioni su ciò che la soluzione dovrebbe restituire per input specifici.
isLeap?: function [year][
panic "please implement the isLeap? function"
]
Quando inizi un esercizio, il file della soluzione include un template con la struttura di base di ciò che ci si aspetta.
In questo esempio tratto da Leap, il file contiene una definizione essenziale della funzione isLeap? attesa e, in particolare, un panic che interrompe l'esecuzione dei test.
Rimuovi la riga con panic e poi inizia a scrivere l'implementazione di isLeap?.
import.version:3.0.0 {unitt}!
import {src/leap}!
describe "Leap" [
it "a year not divisible by 4 is a common year" [
expects.be:'false? @[isLeap? 2015]
]
it.skip "a year divisible by 4 and not divisible by 100 is a leap year" [
expects.be:'true? @[isLeap? 1996]
]
]
describe definisce un blocco di casi di test che verificano qualcosa in comune. Possono essere annidati.it e it.skip definiscono entrambi un singolo caso di test, che viene rispettivamente eseguito o saltato.expects introduce l'affermazione che sta al centro di un caso di test. expects.be accetta una funzione predicato che viene usata per fare l'affermazione.In expects.be:'false? @[isLeap? 2015], la suite di test afferma che la funzione isLeap? dovrebbe restituire false per l'anno 2015.
Un altro modo per scriverlo è expects.be:'equal? @[false isLeapYear? 2015], dove affermiamo che il valore restituito da isLeapYear? 2015 è uguale a false.
Questa forma più lunga, che confronta due valori, è il tipo di affermazione più comune nella traccia Arturo.
Il valore atteso viene sempre prima, nel blocco, rispetto al valore del risultato.
suite "Leap" [
test "a year not divisible by 4 is a common year" [
result: isLeap? 2015
assert -> false = result
]
test.skip "a year divisible by 4 and not divisible by 100 is a leap year" [
result: isLeap? 1996
assert -> true = result
]
]
L'API in stile XUnit, introdotta nella v1 di Unitt, è supportata per compatibilità con il passato ed è in gran parte equivalente alla moderna API in stile RSpec, tranne che per le sue affermazioni meno flessibili.
suite definisce un blocco di casi di test che verificano qualcosa in comune. Possono essere annidati.test e test.skip definiscono entrambi un singolo caso di test, che viene rispettivamente eseguito o saltato.assert introduce l'affermazione che sta al centro di un caso di test. L'espressione a destra del -> che segue deve essere vera.Nei test XUnit, di solito prima della riga assert si creano delle variabili che rappresentano il risultato ed eventualmente il valore atteso.
Che tu stia usando l'API RSpec o quella XUnit, l'output dei test sarà in gran parte simile.
L'unica differenza sarà ciò che viene stampato sotto il nome di ogni test.
XUnit riporta l'affermazione usando i valori valutati, quindi vedrai false = false.
RSpec, invece, la riporta come false? false, perché abbiamo usato la funzione false? con expects.
Partendo dall'inizio, Arturo segnalerà un errore se il panic del file iniziale non è stato rimosso e non valuterà nessun test.
Uncaught error in tests/test-leap.art:
#[
output: {
══╡ Program Error ╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ <script> ══
Please implement the isLeap? function
}
code: 1
]
Una volta sostituito il panic, Arturo riporterà lo stato di ogni affermazione fatta all'interno di un test.
Ora il primo test passa, ma il secondo è saltato.
======== .unitt/tests/test-leap.art ========
Describe: Leap
✅ - assert that a year not divisible by 4 is a common year
✅: false? false
⏩ - assert that a year divisible by 4 and not divisible by 100 is a leap year
skipped!
========== Summary ==========
⏏️ TOTAL: 2 assertions
✅ PASSED: 1 assertion
⏩ SKIPPED: 1 assertion
❌ FAILED: 0 assertion
========== ======= ==========
Dopo che il secondo test è stato riattivato manualmente, verranno eseguiti entrambi.
Tuttavia, l'attuale implementazione del codice di isLeap? restituisce solo false, quindi l'affermazione del secondo test fallisce.
======== .unitt/tests/test-leap.art ========
Describe: Leap
✅ - assert that a year not divisible by 4 is a common year
✅: false? false
❌ - assert that a year divisible by 4 and not divisible by 100 is a leap year
❌: true? false
========== Summary ==========
⏏️ TOTAL: 2 assertions
✅ PASSED: 1 assertion
⏩ SKIPPED: 0 assertion
❌ FAILED: 1 assertion
========== ======= ==========
Questo processo continuerà man mano che riattivi altri test. Quando tutti i test passano, hai finito l'esercizio e puoi inviare la soluzione. Tieni presente che il test runner eseguirà tutti i test, siano essi saltati o meno, in locale.