zoukankan      html  css  js  c++  java
  • 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]
    • [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 = 1
            self.s = 'hop' 
            self.t1 = {1,2,3}
            self.t2 = {one=1,two=2,three=3}
            self.t3 = {1,2,three=3}
        end
    
        function TestToto:test1_withFailure()
            -- print( "some stuff test 1" )
            lu.assertEquals( self.a , 1 )
            -- will fail
            lu.assertEquals( self.a , 2 )
            lu.assertEquals( self.a , 2 )
        end
    
        function TestToto:test2_withFailure()
            -- print( "some stuff test 2" )
            lu.assertEquals( self.a , 1 )
            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 , 1 )
            lu.assertEquals( self.s , 'hop' )
            lu.assertEquals( type(self.a), 'number' )
        end
    
        function TestToto:test4()
            -- print( "some stuff test 4" )
            lu.assertNotEquals( self.a , 1 )
        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( {1,2}, 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 = 1
            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 , 1 )
            -- will fail
            lu.assertEquals( self.a , 2 )
            lu.assertEquals( self.a , 2 )
        end
    
        function TestTiti:test2_withFailure()
            -- print( "some stuff test 2" )
            lu.assertEquals( self.a , 1 )
            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 , 1 )
            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( 1 == 1)
        -- will fail
        assert( 1 == 2)
    end
    
    function test2_withFailure()
        assert( 'a' == 'a')
        -- will fail
        assert( 'a' == 'b')
    end
    
    function test3()
        assert( 1 == 1)
        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

  • 相关阅读:
    AIO系列文档(2)----TIO使用
    AIO系列文档(1)----图解ByteBuffer
    Dubbo+zookeeper构建高可用分布式集群(二)-集群部署
    Dubbo+zookeeper构建高可用分布式集群(一)-单机部署
    利用redis + lua解决抢红包高并发的问题
    使用SIP Servlet为Java EE添加语音功能
    Java互联网架构-直播互动平台高并发分布式架构应用设计
    搭建自己的SIP服务器:开源sip服务器opensips的搭建及终端TwInkle的使用
    SIP协议搭建电信级VOIP/IM运营平台--架构篇(sip集群)
    阿里分布式事务解决方案-GTS
  • 原文地址:https://www.cnblogs.com/lightsong/p/5875445.html
Copyright © 2011-2022 走看看