Come testare le funzioni in una directory privata?
-
12-10-2019 - |
Domanda
MATLAB xUnit per testare un certo codice. Mi piacerebbe essere in grado di chiamare direttamente alcune funzioni che sono contenuti in una directory private
.
Ecco un semplice configurazione replicabile:
Crea una directory di progetto con due cartelle code
e test
. In code
, creare una sottodirectory denominata private
così voi albero delle directory assomiglia
project_root
code
private
test
Al posto directory code
una funzione
function y = main()
y = sub();
end
Nel luogo private
dir una funzione
function y = sub()
y = 123;
end
Nel luogo test
dir una funzione
function testsub()
assertElementsAlmostEqual(sub(), 123);
end
Ora accedere alla directory di test e chiamata runtests
. Si dovrebbe vedere un errore dicendo che sub
è indefinito.
directory private
non sono ammessi sul percorso MATLAB in modo che non è un'opzione. Potrei forse mettere una funzione nel dir code
che recupera maniglie a tutte le funzioni private ma questo sembra hacky.
Qual è il modo migliore per ottenere l'accesso a testare le funzioni private?
EDIT:
L'idea di navigare alla directory privata ha un problema. In teoria potrei chiamare, per es.,
cd(privateDirectory);
suite = TestSuite.fromName(testDirectory);
suite.run
Purtroppo i naviga framework di test per la directory contenente i test non appena si chiama run
.
Soluzione
Una soluzione è quella di passare alla directory privato da nel testsub
, ottenere un maniglia funzione alla funzione privata si desidera utilizzare STR2FUNC , torna quindi passare a fare il test utilizzando la funzione che la maniglia. Si potrebbe anche mettere questi passaggi in una funzione di supporto separato per il test di unità, in questo modo:
function privateFcn = get_private_fcn(privateDir,fcnName)
oldDir = cd(privateDir); %# Change to the private directory
privateFcn = str2func(fcnName); %# Get a function handle
cd(oldDir); %# Change back to the original directory
end
E si sarebbe utilizzare questa funzione in testsub
come segue:
function testsub()
privateDir = '...\project_root\code\private'; %# The path to the private
%# directory
privateFcn = get_private_fcn(privateDir,'sub'); %# Call get_private_fcn
assertElementsAlmostEqual(privateFcn(), 123); %# Apply your test
end
Questo funziona, anche se l'editor di MATLAB mi dà un M-Lint avvertimento per utilizzare la funzione CD : "l'uso MCC della funzione CD è problematico." Penso che sia sicuro per voi di ignorare questo avvertimento dal 1) la funzione get_private_fcn
cambia la directory corrente, poi subito lo cambia di nuovo dopo aver ottenuto la maniglia funzioni e 2) che non sei si tratta di un'applicazione schierato.
Altri suggerimenti
Anche se non si può mettere un directory privata sul vostro percorso di ricerca, è possibile cd alla directory privata stessa.
Una volta lì, MATLAB vedrà le funzioni, e li può usare. Questo è come lo faccio io stesso test sulle funzioni private.
Il punto di directory private è quello di avere funzioni che sono molto visibilità limitata, vale a dire solo per le funzioni in code
. Quindi, non v'è alcun modo ufficiale (almeno che io sappia) per renderli visibili.
La funzione che recuperare le maniglie per tutto ciò che è in code/private
mi sembra il modo più pulito per andare su di esso.
L'alternativa sarebbe quella di inserire all'interno testsub
code
. Questo ha il vantaggio che le funzioni di test sono sempre insieme con il codice che si suppone di prova, ma si può sentire questo "inquina" la directory di codice.