TDD, gestione della configurazione, schemi di configurazione (PHP)

1

Sto scrivendo un'applicazione PHP, seguendo i principi di sviluppo basati sui test.

Voglio due diverse configurazioni: una per lo sviluppo e una per la produzione.

Espanderò continuamente le funzionalità dell'applicazione, quindi un problema è che non voglio che le credenziali / la configurazione di produzione vengano sovrascritte ogni volta che carico un aggiornamento. Questa è solo una euristica. E potrebbe essere fatto in 100 modi diversi. Non riesco a vedere il legno per gli alberi, ho bisogno di aiuto!

Esempio 1: l'applicazione si interrompe con l'API di Ebay. Per l'applicazione per autenticarsi con Ebay, è necessario inviare le chiavi di autenticazione. Ma avrò bisogno di due set di chiavi: una per lo sviluppo nella sandbox di Ebay e un'altra per la produzione. Alla fine, questi saranno archiviati in un database o simili, poiché scadono e necessitano di essere rinnovati, ma fingono che non sia il caso - assumono che sono statici.

Esempio 2: host, nome e credenziali del database che sarebbero diversi in fase di test e produzione

Ho difficoltà ad articolare la mia domanda. In breve, voglio seguire le migliori pratiche del TDD.

Il mio istinto sarebbe di avere un file di configurazione che viene letto da qualche classe. Questo offre due opzioni:

  1. O ci sarebbero due file, uno per i test e uno per la produzione, o
  2. un solo file di configurazione, il cui contenuto verrebbe modificato per la produzione.

Ma diciamo che scegliamo l'opzione 1, torniamo al punto di partenza, perché da qualche parte ci deve essere un'impostazione che dice se questo è il test o l'ambiente di produzione.

E diciamo che scegliamo l'opzione 2, la posizione del file avrebbe ancora bisogno (?) di essere codificata in modo difficile da qualche parte.

E poi c'è lo scenario in cui gli oggetti devono essere scambiati a seconda che si tratti di produzione o sviluppo. AFAIK il modello factory risolve questo problema, ma ancora, da qualche parte, il codice deve essere detto in quale ambiente ci troviamo e / o quale delle due classi usare.

Nei libri che ho letto, il principio che penso è di trattare l'applicazione come una cipolla, alimentando le informazioni di configurazione per l'applicazione in modo che l'intera applicazione sia indipendente dal contesto. Quindi, per uno strumento da riga di comando, la configurazione potrebbe essere fornita da argomenti della riga di comando. Ma come si potrebbe fare per un'applicazione Java Swing o un'app Web PHP?

    
posta CL22 05.08.2015 - 14:54
fonte

5 risposte

0

Una soluzione che ho usato in passato è che l'applicazione usi il nome host della macchina su cui è in esecuzione per individuare il file di configurazione, quindi se è in esecuzione su una macchina chiamata www7 , caricherà config.www7.inc , mentre se è in esecuzione su minerva caricherà config.minerva.inc . Ci vuole un momento per impostare una nuova macchina, ma dopo è abbastanza semplice.

    
risposta data 05.08.2015 - 16:33
fonte
2

Non hai bisogno di un'impostazione che dice se sei in sviluppo o produzione o meno. Hai solo bisogno di impostazioni che diano alla tua applicazione come gestire certe cose. Chiavi API, stringhe di connessione al database, ... queste sono tutte basi 'leggere questo valore e usarlo' e questo è il tipo di cose a cui i file di configurazione sono validi.

È un po 'diverso se la tua implementazione è diversa. Ad esempio, supponiamo che desideri che il tuo ambiente di sviluppo scriva le e-mail in una directory di registrazione e che l'ambiente di produzione li invii effettivamente al destinatario. Scrivi tutto il tuo codice su un'interfaccia ('IMailer') e scrivi due implementazioni: SMTPMailer e LogMailer. Il tuo file di configurazione contiene una voce che dice quale implementazione dovrebbe usare IMailer. Per l'ambiente di sviluppo / test, è sufficiente avere quel punto di accesso al LogMailer. Cerca nei framework IoC e IoC per questo.

    
risposta data 05.08.2015 - 16:43
fonte
1

Un modo molto pulito sta usando Git:

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

For more information and downloads: https://git-scm.com

Con Git usi le branch, come develop , master , feature / , ecc. Leggi di più qui: link

Memorizza la configurazione di produzione nel ramo master , la configurazione di sviluppo in sviluppo ramo, ecc.

    
risposta data 05.08.2015 - 18:55
fonte
0

Una soluzione che suona vagamente ragionevole da questa pagina di metodologia dei 12 fattori sulla configurazione.

La guida più mirata che ho trovato finora è qui nella metodologia dei 12 fattori . Suggeriscono che tali configurazioni debbano essere memorizzate in variabili d'ambiente. Ma come si farebbe in PHP? Qui si consiglia di utilizzare un file .htaccess.

    
risposta data 05.08.2015 - 16:27
fonte
0

Senza vedere il codice o i test effettivi è difficile dirlo, ma perché è necessario utilizzare effettivamente il servizio nel test? Faresti meglio a prendere in giro l'API di ebay e non preoccuparti delle differenze di produzione / dal vivo.

    
risposta data 05.08.2015 - 17:37
fonte

Leggi altre domande sui tag