lua unit test introduction
Unit Test
Unit testing is about testing your code during development, not in production. Typically you start by preparing the testing environment, writing some code that calls production code and check expected results with actual results.
http://lua-users.org/wiki/UnitTesting
单元测试是在开发过程中测试你的代码, 不是放在产品中测试。
典型步骤:
1 开始准备测试环境
2 写一些代码调用产品功能代码
3 检验期望的结果和实际结果是否相符
各类测试框架
Lua has several frameworks to do that:
- [lunit]
- Fork with Lua 5.2 support: [lunitx]
- [Lunity] (similar to lunit, but can only run a single file and doesn't distinguish between errors and test assertions)
- [lunatest] (upwardly compatible from lunit, but no dependencies, and also supports randomized testing)
- [LuaUnit] (supports Lua 5.1 and 5.2, no dependencies, see below)
- [Shake] - source preprocessing using basic assert-like syntax (see below)
- [build-test-deploy (BTD)] - Unit testing inspired by jUnit and originally based on LuaUnit
- [luaspec][1] - Behavior Driven Development (BDD) test framework
- [PenLight pl.test] - PenLightLibraries? has a very small unit testing library, mostly for internal testing. See the Penlight tests [here]
- [telescope] - A highly customizable test library for Lua that allows for declarative tests with nested contexts. Uses BDD-style spec names.
- [lua-TestMore] - port of the Perl5 module Test::More (Test Anything Protocol).
- [busted] - Behavior Driven Development (BDD) unit testing library, with various outputs formats including TAP and focus on elegance.
- [gambiarra] - Ultimately minimal unit testing library for Lua 5.1 and Lua 5.2.
- [Testy] - Lua script for minimal unit testing on Lua 5.1/5.2/5.3 that collects test functions from local variables.
They have mostly the same feature set, which is:
- a special set of assert functions
- facilities to group tests into test suites
- facilities to detect where test fails
测试框架大都有相同的特性集合:
1 assert函数的特殊集合
2 将测试分组为若干测试套件
3 检测测试失败的代码点
框架比较
http://lua-users.org/wiki/UnitTesting
| 名称 | 地址 | 最近发布时间 | 是否支持group | 测试用例写法 | 支持lua版本 |
| LuaUnit | https://github.com/bluebird75/luaunit |
Version 3.2 - 12. Jul 2016 |
是 | OOP & 函数 | Lua 5.1, LuaJIT 2.0, LuaJIT 2.1 beta, Lua 5.2 and Lua 5.3 |
|
https://www.mroth.net/lunit/ | 5. November 2009: Lunit Version 0.5 released. | 否 | 函数 | Lua 5.1 |
busted |
http://olivinelabs.com/busted/#spies-mocks-stubs |
v2.0.rc11-0 28 Oct 2015 |
BDD | lua >= 5.1, moonscript, terra, and LuaJIT >= 2.0.0. | |
lunatest |
https://github.com/silentbicycle/lunatest |
v0.9.5 3 Apr 2014 |
是(同时支持分文件管理) | OOP & 函数 | Upgrade to Lua 5.2, but keep compatible with Lua 5.1 |
luaspec |
https://github.com/mirven/luaspec | BDD | |||
Lunity |
https://github.com/Phrogz/Lunity | v0.10 15 Feb 2014 | 否 | 函数 | Lua 5.1 |
从表中看出, luaUnit 最活跃, 支持lua版本最多, 测试用例的写法最灵活。
lunatest其中测试用例可以拆分为子文件的方法,对庞大测试用例维护有好处。
BDD(行为驱动开发)领域 BUSTED最为成熟,和活跃, 文档最完善。
luaUnit 测试DEMO
文档:
http://luaunit.readthedocs.io/en/latest/ 含有接口介绍
https://github.com/bluebird75/luaunit
说明:
1、 setup 和 teardown在没个测试函数之前和之后都会执行。
2、 以test为开头的函数都会被执行。
#!/usr/bin/env lua
local lu = require('luaunit')
TestToto = {} --class
function TestToto:setUp()
-- set up tests
self.a =
self.s = 'hop'
self.t1 = {,,}
self.t2 = {one=,two=,three=}
self.t3 = {,,three=}
end
function TestToto:test1_withFailure()
-- print( "some stuff test 1" )
lu.assertEquals( self.a , )
-- will fail
lu.assertEquals( self.a , )
lu.assertEquals( self.a , )
end
function TestToto:test2_withFailure()
-- print( "some stuff test 2" )
lu.assertEquals( self.a , )
lu.assertEquals( self.s , 'hop' )
-- will fail
lu.assertEquals( self.s , 'bof' )
lu.assertEquals( self.s , 'bof' )
end
function TestToto:test3()
-- print( "some stuff test 3" )
lu.assertEquals( self.a , )
lu.assertEquals( self.s , 'hop' )
lu.assertEquals( type(self.a), 'number' )
end
function TestToto:test4()
-- print( "some stuff test 4" )
lu.assertNotEquals( self.a , )
end
function TestToto:test5()
-- print( "some stuff test 5" )
lu.assertTrue( self.a )
lu.assertFalse( self.a )
end
function TestToto:test6()
-- print( "some stuff test 6" )
lu.assertTrue( false )
end
function TestToto:test7()
-- assertEquals( {1,2}, self.t1 )
-- assertEquals( {1,2}, self.t2 )
lu.assertEquals( {,}, self.t3 )
end
function TestToto:test8a()
-- failure occurs in a submethod
self:funcWithError()
end
function TestToto:test8b()
-- failure occurs in a submethod
self:funcWithFuncWithError()
end
function TestToto:funcWithFuncWithError()
self:funcWithError()
end
function TestToto:funcWithError()
error('Bouhouhoum error!')
end
-- class TestToto
TestTiti = {} --class
function TestTiti:setUp()
-- set up tests
self.a =
self.s = 'hop'
-- print( 'TestTiti:setUp' )
end
function TestTiti:tearDown()
-- some tearDown() code if necessary
-- print( 'TestTiti:tearDown' )
end
function TestTiti:test1_withFailure()
-- print( "some stuff test 1" )
lu.assertEquals( self.a , )
-- will fail
lu.assertEquals( self.a , )
lu.assertEquals( self.a , )
end
function TestTiti:test2_withFailure()
-- print( "some stuff test 2" )
lu.assertEquals( self.a , )
lu.assertEquals( self.s , 'hop' )
-- will fail
lu.assertEquals( self.s , 'bof' )
lu.assertEquals( self.s , 'bof' )
end
function TestTiti:test3()
-- print( "some stuff test 3" )
lu.assertEquals( self.a , )
lu.assertEquals( self.s , 'hop' )
end
-- class TestTiti
-- simple test functions that were written previously can be integrated
-- in luaunit too
function test1_withFailure()
assert( == )
-- will fail
assert( == )
end
function test2_withFailure()
assert( 'a' == 'a')
-- will fail
assert( 'a' == 'b')
end
function test3()
assert( == )
assert( 'a' == 'a')
end
local runner = lu.LuaUnit.new()
runner:setOutputType("tap")
os.exit( runner:runSuite() )
LOG:
1..15
# Started on 09/15/16 20:53:03
# Starting class: TestTiti
not ok 1 TestTiti.test1_withFailure
example_with_luaunit.lua:101: expected: 2, actual: 1
not ok 2 TestTiti.test2_withFailure
example_with_luaunit.lua:110: expected: "bof"
actual: "hop"
ok 3 TestTiti.test3
# Starting class: TestToto
not ok 4 TestToto.test1_withFailure
example_with_luaunit.lua:21: expected: 2, actual: 1
not ok 5 TestToto.test2_withFailure
example_with_luaunit.lua:30: expected: "bof"
actual: "hop"
ok 6 TestToto.test3
not ok 7 TestToto.test4
example_with_luaunit.lua:43: Received the not expected value: 1
not ok 8 TestToto.test5
example_with_luaunit.lua:49: expected: false, actual: 1
not ok 9 TestToto.test6
example_with_luaunit.lua:54: expected: true, actual: false
not ok 10 TestToto.test7
example_with_luaunit.lua:60: expected: {1, 2, three=3}
actual: {1, 2}
not ok 11 TestToto.test8a
example_with_luaunit.lua:78: Bouhouhoum error!
not ok 12 TestToto.test8b
example_with_luaunit.lua:78: Bouhouhoum error!
not ok 13 test1_withFailure
example_with_luaunit.lua:126: assertion failed!
not ok 14 test2_withFailure
example_with_luaunit.lua:132: assertion failed!
ok 15 test3
# Ran 15 tests in 0.004 seconds, 3 successes, 8 failures, 4 errors
lua unit test introduction的更多相关文章
- Unit Testing with NSubstitute
These are the contents of my training session about unit testing, and also have some introductions a ...
- Lua Doc生成工具
Luadoc http://keplerproject.github.io/luadoc/ Overview LuaDoc is a documentation generator tool for ...
- CG&Game资源(转)
cg教程下载: http://cgpeers.com http://cgpersia.com http://bbs.ideasr.com/forum-328-1.html http://bbs.ide ...
- 面向小白的JS笔记 - #Codecademy#学习笔记
前言 最初浏览过<JavaScript秘密花园>,前一段时间读过一点点<JavaScript语言精粹>和一点点<JavaScript高级程序设计>(一点点是指都只是 ...
- How to Avoid Producing Legacy Code at the Speed of Typing
英语不好翻译很烂.英语好的去看原文. About the Author I am a software architect/developer/programmer.I have a rather p ...
- 基于 Cocos2d-x-lua 的游戏开发框架 Dorothy 简介
基于 Cocos2d-x-lua 的游戏开发框架 Dorothy 简介 概述 Dorothy 是一个在 Cocos2d-x-lua 基础上发展起来的分支, 它去掉 Cocos2d-x-lua 那些过多 ...
- 斯坦福CS课程列表
http://exploredegrees.stanford.edu/coursedescriptions/cs/ CS 101. Introduction to Computing Principl ...
- [Unit Test] Unit Test Brief Introduction
Levels of Testing- Acceptance- Performance- Functional- Integration- Unit Why Unit Testing- Feedback ...
- Unit Tests Tool - <What is “Mock You”> The introduction to moq #Reprinted#
From: http://www.cnblogs.com/wJiang/archive/2010/02/21/1670632.html Moq即Mock You Framework,故名思意是一个类似 ...
随机推荐
- C++ 定义全局数组
数组怎么用,全局数组就怎么用,只是他的作用域不一样才叫全局数组... 在A.h 或 A.cpp中定义char buf[10]; 如果在B.cpp要用,就在其开头中写成 extern char buf[ ...
- windows消息钩子注册底层机制浅析
标 题: [原创]消息钩子注册浅析 作 者: RootSuLe 时 间: 2011-06-18,23:10:34 链 接: http://bbs.pediy.com/showthread.php?t= ...
- C# 默认以管理员权限运行程序
/** * 当前用户是管理员的时候,直接启动应用程序 * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行 */ //获得当前登录的Windows用户标示 //URL:http://w ...
- 浅谈Margin和Padding值设置成百分数的布局
转自:问说网http://www.uedsc.com/discussion-margin-and-padding-values.html Margin和Padding是我们在网页设计经常使用到的CSS ...
- [NOIP2011]Mayan游戏 题解
题目大意: 有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落.每步移动可以且仅可以沿横向 ...
- MongoDB命令及SQL语法对比
mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(col ...
- showModalDialog 刷新问题,在页面中跳转问题
showModalDialog 刷新问题 ,在页面中跳转问题 <html><head> <base target="_self" >< ...
- HTML当中特殊字符的表示
(回车换行) <br> (空格符) &(AND符号) & <(左尖括号.小于号) < >(右尖括号.大于号) > °(度) ° •(间隔符) ...
- <六>JDBC_DAO 设计模式
JDBC_DAO设计模式 DAO:Data Access Object(数据访问对象) why:实现功能的模块化,更有利于代码的维护和升级. what:访问数据信息的类,包含了对数据的CRUD(c ...
- C++ I/O stream
C++ I/O stream Ø The first, you should understand following: ... Ø Text: Ø Version: Visual studio 20 ...