LUA > UnitTest > Lunit

Miért érdemes fejest ugrani a tesztelésbe?
Az igények változásával a kódok is változnak. Hogy ellenőrizni tudjuk tudja-e még teljesíteni a régi specifikációt teszteket írunk. Erre ad lehetőséget Michael Roth lunit csomagja.

Telepítés:


luarocks install lunit

Ahhoz hogy közelebbről is megismerkedjünk az egységteszteléssel, átugrunk egy pythonos oldalra. És megpróbálunk írni egy római szám konvertáló progit, ahol toRoman függvény 1 és 3999 közötti egészből csinál római számot.

roman.lua
* ami tulajdonképpen csak egy váz valós funkcionalitás nélkül


module(..., package.seeall) 
function toRoman(input)

	if type(input) ~= "number" then
	
		return nil, "input is not a number"
	end
	if input <1 or input > 3999 then
		return nil, "out of range"
		
	end
	return "xiii"
end

És a tesztmodul, roman_testcase.lua:


require "lunit"
require "roman"

module( "roman_testcase", lunit.testcase, package.seeall )

--
-- toRoman input tests
--
function testToRomanInputNonInt()
	-- toRoman should fail when given a non-integer number.  --
	
	local badInput="klikkklakk"
	local result=roman.toRoman(badInput)
	assert_nil(result, "[-] Input must be a number")

end
function testToRomanInputRange()
	-- toRoman should fail when given an integer outside the range 1 to 3999.   --
	
	local outOfRange=9999
	local result = roman.toRoman(outOfRange)
	assert_nil(result, "[-] Input must be a number between 1 and 3999")
end
--
-- toRoman output tests
--
function testToRomanOutputUppercase()
	-- toRoman should always return a Roman numeral using uppercase letters. --
	function checkUpper(input)
		if string.upper(input) == input then
			return true
		end
		return false
	end
	
	result = roman.toRoman(13)
	-- assert_true( checkUpper(result), "[-] Output is not uppercase" )

	assert_equal( result:upper(), result )
end

Tesztelés:


$ lunit roman_testcase.lua 
Loaded testsuite with 3 tests in 1 testcases.

    ..F

3 Assertions checked.

  1) Failure (roman_testcase.testToRomanOutputUppercase):
roman_testcase.lua:39: expected 'XIII' but was 'xiii'

Testsuite finished (2 passed, 1 failed, 0 errors).

Mi is történik itt?

Egy külön modulban helyeztük el a római számokkal foglalkozó függvényeket. Konkrétan a toRoman függvényre írtunk két bemeneti és egy kimeneti tesztet.

A testToRomanInputNonInt teszt függvény ellenőrzi, hogy ha nem számot adunk meg a függvénynek, dob-e hibát.
A testToRomanInputRange tesztfüggvény ellenőrzi, hogy ha a tartományon kívűli értéket adunk meg dob-e megfelelő hibát.
A testToRomanOutputUppercase tesztfüggvény ellenőrzi, hogy a visszakapott érték csak nagybetűből áll.

Windows alól:
lunit.bat


@echo off
lua - %0 %* < starter.lua

Ahol a starter.lua:


  local scriptname = ...
  local argv = { select(2,...) }
  if scriptname ~= "" then
    local function force(name)
      pcall( function() loadfile(name)() end )
    end
    force( scriptname..".lua" )
    force( scriptname.."-console.lua" )
  end
  require "lunit"
  local stats = lunit.main(argv)
  if stats.errors > 0 or stats.failed > 0 then
    os.exit(1)
  end

Egy hátránya van, hogy nem igazán mobilis megoldás. Azaz a lunit.bat mellé kell másolni a starter.lua-t. :( Ennyire futotta.