这几天在学ruby, 自己写了一个简单的单元测试库, 有点DSL的感觉。
似乎没有ruby的格式化, 用Lua凑合一下吧。
sample code:
require 'rUnit'
include RUnit

testSuite :SampleTestSuite do
setup do
end
tearDown do
end
testCase :TestEqualPass do
assertEqual 1.0, 4.0-3.0
end
testCase :TestEqualFail do
assertEqual 1, 2
end
testCase :TestFail do
assert 1>3
end
testCase :TestException do
raise 'Exception raised'
end
end

Output:
SampleTestSuite
Passed:TestEqualPass
Failed:TestEqualFail (Expected <1> but <2>.)
Failed:TestFail (Expected <true> but <false>)
Failed:TestException (Exception raised)
Lib Source:

rUnit
module RUnit
class TestSuite
attr_reader :name
attr_accessor :setup, :teardown
def initialize(name)
@name = name
@testCases = []
end
def addTestCase(testCase)
@testCases << testCase
self
end
def run()
@testCases.collect do |tc|
begin
@setup.run if @setup
tc.run
ensure
@teardown.run if @teardown
end
end
end
end
class SetUp
def initialize(block)
@block = block
end
def run
@block.call
end
end
class TearDown < SetUp
end
class TestCase
attr_reader :name
def initialize(name, block)
@name = name
@block = block
end
def run()
@block.call()
TestResult.new(@name, true)
rescue =>ex
TestResult.new(@name,false,ex)
end
end
class TestResult
attr_reader :message,:status,:testCaseName
def initialize(testCaseName, status, message=nil)
@testCaseName = testCaseName
@status = status
@message = message
end
end

def printResult(name,results)
puts name
results.each do |r|
status = :Failed
status = :Passed if r.status
message = "\t#{status}:#{r.testCaseName}"
message += " (#{r.message})" if r.message
puts message
end
end

module_function
def testSuite(name, &block)
@testSuite = TestSuite.new(name)
block.call
results = @testSuite.run
printResult(name, results)
end
def testCase(name, &block)
@testSuite.addTestCase TestCase.new(name, block)
end
def setup(&block)
raise 'Test suite can have only one setup method' if @testSuite.setup
@testSuite.setup = SetUp.new(block)
end
def tearDown(&block)
raise 'Test suite can have only one teardown method' if @testSuite.teardown
@testSuite.teardown = TearDown.new(block)
end
def assert(expression)
assertFail 'Expected <true> but <false>' unless expression
end
def assertEqual(expected, actual)
assertFail "Expected <#{expected}> but <#{actual}>." unless expected == actual
end
def assertFail(message)
raise message
end
end

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述