2017-09-22 3 views
3

Je voudrais tester les fonctions de test à partir d'un seul fichier Lua script, par exemple script.lua. Le script ressemble à quelque chose comme suit:Comment puis-je tester les fonctions dans un seul fichier Lua script?

-- some fields from gvsp dissector which shall be post processed in custom dissector 
gvsp_field0_f = Field.new("gvsp.<field0-name>") 
gvsp_field1_f = Field.new("gvsp.<field1-name>") 

-- custom protocol declaration 
custom_protocol = Proto("custom","Custom Postdissector") 

-- custom protocol field declarations 
field0_f = ProtoField.string("custom.<field0-name>","Custom Field 0") 
field1_f = ProtoField.string("custom.<field1-name>","Custom Field 1") 

-- register custom protocol as postdissector 
register_postdissector(custom_protocol) 

function custom_protocol.dissector(buffer,pinfo,tree) 
    -- local field values of "pre" dissector which are analyzed 
    local gvsp_field0_value = gvsp_field0_f() 
    local gvsp_field1_value = gvsp_field1_f() 

    -- functions which shell be unit tested 
    function0(...) 
    function1(...) 
end 

function0(...) 
    -- implementation 
end 

function1(...) 
    -- implementation 
end 

Disons que je ne veux pas séparer les fonctions du fichier de script dans un fichier de module séparé (ce qui serait probablement rendre les choses plus facile). Comment puis-je définir des tests (de préférence avec luaunit car facile à intégrer, mais un autre outil serait correct) pour les fonctions définies dans script.lua dans le fichier script.lua ou dans un fichier séparé test_script.lua?

+0

Cela dépend _a beaucoup_ sur _how_ vous définissez les choses. Utilisez-vous 'local' (ce qui rend les choses beaucoup plus difficiles) ou utilisez-vous des ''' '' '' '' '' '' '' '' '' '' '' 'locaux' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Comment votre code est-il structuré? S'il vous plaît ajoutez un petit échantillon de code de la façon dont vous définissez les fonctions etc. (ne doit pas être le code réel, juste des fonctions fictives qui correspondent à la façon dont vous définissez vos trucs.) À l'heure actuelle, il n'y a pas assez d'informations réponses. – nobody

+0

Le script se verrouille comme le post-dissecteur de https://wiki.wireshark.org/Lua/Dissectors#postdissectors avec les fonctions 'local' définies à la fin du fichier qui sont utilisées dans la fonction' dissector' du protocole. Cependant je ne m'en tiens pas à cette structure. – thinwybk

Répondre

0

Pour activer le script séparé et l'exécution du test unitaire, il faut au moins 3 fichiers (dans cet exemple 4 car le framework de test unitaire luaunit qui consiste en un seul fichier est intégré dans le répertoire du projet). Pour cet exemple, tous les fichiers résident dans le même répertoire. Le script script.lua ne peut y définir aucune fonction mais doit importer toutes les fonctions dont il a besoin à partir de son module module.lua.

-- script imports module functions 
module = require('module') 

-- ... and uses it to print the result of the addition function 
result = module.addtwo(1,1) 
print(result) 

module.lua est mis en œuvre accoring au Lua module skeleton que ses fonctions sont automatiquement enregistrées pour l'importation par d'autres fichiers de script ou modules.

-- capture the name searched for by require 
local NAME=... 

-- table for our functions 
local M = { } 

-- A typical local function that is also published in the 
-- module table. 
local function addtwo(a,b) return a+b end 
M.addtwo = addtwo 

-- Shorthand form is less typing and doesn't use a local variable 
function M.subtwo(x) return x-2 end 

return M 

test_module.lua contient les tests unitaires pour les fonctions du module et des importations luaunit.lua (cadre de test unitaire) pour son exécution. test_module.lua a le contenu suivant.

luaunit = require('luaunit') 
script = require('module') 

function testAddPositive() 
    luaunit.assertEquals(module.addtwo(1,1),2) 
end 

os.exit(luaunit.LuaUnit.run()) 

Si vous exécutez les tests en exécutant lua test_module.lua les tests sont exécutés séparément de la fonctionnalité de script.

. 
Ran 1 tests in 0.000 seconds, 1 success, 0 failures 
OK 

Le script est exécuté comme d'habitude avec lua script.lua avec sortie 2.

2

Réponse simple: Vous ne pouvez pas! J'ai demandé cela à l'équipe Lua il y a quelques années, car il n'y a aucun moyen évident pour un script de savoir s'il s'agit du script principal en cours d'exécution ou inclus (par exemple, 'require').

Il ne semble pas intéressant d'ajouter une telle capacité dans un avenir prévisible non plus!

+0

Ok. Et qu'en est-il de l'implémentation des tests dans un test_script.lua distinct? – thinwybk

+0

Je ne suis pas sûr de comprendre. Que dire de cela? Il vous suffit de «demander» au fichier de tester votre fichier de test et d'appeler ses fonctions publiques si nécessaire. – tonypdmtr

+0

Dans l'exemple ci-dessous, la fonctionnalité principale des scripts est exécutée en plus des tests unitaires. Je ne veux pas que la fonctionnalité principale des scripts soit exécutée pendant l'exécution du test unitaire. – thinwybk