Se pensi di non poter testare senza requisiti, non comprendi lo scopo dei test.
I'm in a funny situation.
No, non lo sei. Questo è tipico di molti negozi che usano TDD.
To give you a sense of the environment, when we were using SCRUM, we would often intentionally commit to only 50% of our maximum workload, with a full expectation that the remaining 50% would be filled with quick response work.
Sono stato in negozi in cui è stato generoso. È un mondo diverso quando si dispone di sistemi operativi con requisiti di uptime. Scrum e TDD funzionano ancora bene se li fai bene.
However, I find myself regularly faced with situations that do not have testable requirements until the majority of the work is completed. Because of the rapid response nature of the job, finding the solution that can be done is more important than holding to an arbitrary API picked at the start of the task. It's of no use to my customer if I can build their dream API in a month, when they need to have a working product in a week. The API only really gets finalized after we understand how the code is actually going to do the task.
Chi ti ha convinto a mantenere una presa mortale su un'API indipendentemente dalle tue esigenze era tradizionale?
In situations where testable requirements are hard to come by, has anyone had success leveraging TDD in a meaningful way, even if it's not the "traditional" way?
Ho avuto successo con TDD quando l'unico requisito che avevo era "Mi chiedo cosa faccia questa cosa".
I test non sono requisiti. Potresti avere un requisito. Potresti scrivere un test che dimostra che il requisito è soddisfatto. Potresti anche menzionare quel numero di requisito nei commenti del test (o, Dio ci aiuti, nel suo nome). Belle. Ma se questo è tutto quello che stai facendo con i test, non sai cosa stai facendo. I test sono per di più. Molto di più.
Scrivo tonnellate di test. Più di quanto abbia mai fatto il check-in. Perché? Perché i test mi aiutano a leggere il codice. Scrivo test dopo test e guardo la mia comprensione di ciò che posso fare crescere e crescere. Cambio codice e cambio test, rapidamente. Perché sto imparando. I test bloccano ciò che comprendo ora. Mi ricordano cosa stavo facendo quando torno dal bagno.
Quindi sì, a volte scrivo test senza mai guardare o pensare a un documento dei requisiti.
Scarico un sacco di test man mano che la mia comprensione cresce. Trovo modi migliori per esprimere ciò che sto cercando di dire. Proprio come torno a questa risposta e la riscrivo e muovo le cose, faccio lo stesso con il mio codice e le mie prove cercando di trovare il modo migliore per esprimere un'idea. Non perché la CPU ha bisogno di me. Non perché i requisiti lo richiedano. Non perché me lo abbia detto TDD. L'inferno lo stavo facendo prima che il TDD fosse una cosa. Lo faccio per gli umani. Sto cercando il modo migliore per presentare un'idea in modo che l'inesperto principiante che viene dopo di me possa facilmente trovare la linea che devono cambiare perché il mondo è cambiato dopo che me ne sono andato. Lo faccio usando codice e test per raccontare la storia dell'idea bene.
Lo scopo dei test è aiutare le persone a leggere il codice.
Mostrano cosa fa, di cosa ha bisogno, quanto codice devi leggere per capire cosa sta succedendo, ma non ti dicono quello che ti serve. Le tue esigenze cambieranno quando i test non saranno stati toccati. Sta a te decidere se il codice fa quello che ti serve. Non i test.
Quando trovi alcuni requisiti puoi scrivere altri test per loro. Puoi mostrarli al proprietario del tuo prodotto. Puoi persino metterli in un posto speciale in modo che tu possa distinguerli da quelli che scrivi per aiutarti a leggere il codice. Questo è BDD.
Quindi non lamentarti del fatto che non puoi scrivere test perché i tuoi requisiti sono nell'aria. Questo descrive più della metà di tutto ciò che ho fatto usando TDD. Qualsiasi codice che scrivi può essere messo sotto test. Quel test è "Penso che il codice farà questo, vediamo se lo fa". Questo dice ai futuri programmatori (incluso me) cosa stavo pensando. Ma decidere se è necessario non è il lavoro di test. Questo è tuo. Se cambi idea, è il momento di apportare modifiche. Cambia il test e poi cambia il codice. Questo è TDD.