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]

  • [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

lunit

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的更多相关文章

  1. Unit Testing with NSubstitute

    These are the contents of my training session about unit testing, and also have some introductions a ...

  2. Lua Doc生成工具

    Luadoc http://keplerproject.github.io/luadoc/ Overview LuaDoc is a documentation generator tool for ...

  3. CG&Game资源(转)

    cg教程下载: http://cgpeers.com http://cgpersia.com http://bbs.ideasr.com/forum-328-1.html http://bbs.ide ...

  4. 面向小白的JS笔记 - #Codecademy#学习笔记

    前言 最初浏览过<JavaScript秘密花园>,前一段时间读过一点点<JavaScript语言精粹>和一点点<JavaScript高级程序设计>(一点点是指都只是 ...

  5. 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 ...

  6. 基于 Cocos2d-x-lua 的游戏开发框架 Dorothy 简介

    基于 Cocos2d-x-lua 的游戏开发框架 Dorothy 简介 概述 Dorothy 是一个在 Cocos2d-x-lua 基础上发展起来的分支, 它去掉 Cocos2d-x-lua 那些过多 ...

  7. 斯坦福CS课程列表

    http://exploredegrees.stanford.edu/coursedescriptions/cs/ CS 101. Introduction to Computing Principl ...

  8. [Unit Test] Unit Test Brief Introduction

    Levels of Testing- Acceptance- Performance- Functional- Integration- Unit Why Unit Testing- Feedback ...

  9. 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,故名思意是一个类似 ...

随机推荐

  1. Could not open Selected VM debug port (8700) (转)

    Could not open Selected VM debug port (8700) 2014年11月14日 ⁄ 综合 ⁄ 共 446字 ⁄ 字号 小 中 大 ⁄ 评论关闭   在运行项目的时候, ...

  2. 反调试技术常用API,用来对付检测od和自动退出程序

    在调试一些病毒程序的时候,可能会碰到一些反调试技术,也就是说,被调试的程序可以检测到自己是否被调试器附加了,如果探知自己正在被调试,肯定是有人试图反汇编啦之类的方法破解自己.为了了解如何破解反调试技术 ...

  3. php 冒泡 快速 选择 插入算法 四种基本算法

    php四种基础算法:冒泡,选择,插入和快速排序法 来源:PHP100中文网 | 时间:2013-10-29 15:24:57 | 阅读数:120854 [导读] 许多人都说 算法是程序的核心,一个程序 ...

  4. Socket 类通信例子-第24章

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. IDE-Sublime【2】-代码智能提示插件SublimeCodeIntel的安装

    一.打开菜单References -> Package Control 二.输入Package Control: install Package,回车 三.输入SublimeCodeIntel, ...

  6. 《Invert》开发日志05:终止

    今天终于看了久闻大名的<独立游戏大电影>,然后我就做了一个坑爹的决定:终止“Invert”项目的开发.没错,在还没正式开工之前,我就决定停掉这个项目,而且是永久终止.做这个决定并不是因为觉 ...

  7. 卸载oracle删除注册表脚本

    一.前言 在我们操作系统中,有时要卸载oracle数据库,每一次都要去删除win下的注册表,为了方便删除注册表的信息,下面通过一种删除注册表快捷的脚本. 二.脚本信息 Windows Registry ...

  8. Maven2 根据项目生成模版项目,并使用该模板批量创建工程。

    Maven 3 创建自己的模版,并使用模版创建工程 1.建立样板Maven工程: myModel 2.进入 myModel 工程根目录执行:mvn archetype:create-from-proj ...

  9. [IOS]译Size Classes with Xcode 6: One Storyboard for all Sizes

    Size Classes with Xcode 6: One Storyboard for all Sizes 为所有的尺寸准备一个Storyboard 我最喜欢的Xcode6的特性是新的size c ...

  10. Java实现验证码制作之一自己动手

    以前弄验证码都是现找现用,下面是自己跟着敲代码弄好的,记录一下,分享给大家. 我这里用的是Servlet ,Servlet代码如下 import java.awt.Color;import java. ...