Ruby Minitest测试:SubstringFinder类测试用例设计咨询
一、Minitest 完整测试套件实现
你可以先在项目 Gemfile 中添加依赖 gem 'minitest',执行 bundle install 完成安装后,新建测试文件 substring_finder_test.rb,内容如下:
require "minitest/autorun" require_relative "substring_finder" # 替换为你 SubstringFinder 代码的实际文件路径 class SubstringFinderTest < Minitest::Test # 核心功能测试用例 def test_returns_all_elements_that_are_substrings_of_other_longer_elements input = ["a", "ab", "abc", "abcd"] expected = ["a", "ab", "abc"] assert_equal expected, SubstringFinder.find_all(input) end def test_matches_are_case_insensitive input = ["AbC", "aBcd", "ABCDE"] expected = ["AbC", "aBcd"] assert_equal expected, SubstringFinder.find_all(input) end def test_exact_same_length_elements_are_not_counted input = ["test", "Test", "testing"] expected = ["test", "Test"] assert_equal expected, SubstringFinder.find_all(input) end def test_returns_empty_array_when_no_substrings_exist input = ["ruby", "python", "java", "go"] expected = [] assert_equal expected, SubstringFinder.find_all(input) end def test_duplicate_substrings_are_all_returned input = ["a", "a", "abc"] expected = ["a", "a"] assert_equal expected, SubstringFinder.find_all(input) end def test_substrings_in_middle_position_are_detected input = ["bc", "abcde"] expected = ["bc"] assert_equal expected, SubstringFinder.find_all(input) end def test_substrings_in_trailing_position_are_detected input = ["de", "abcde"] expected = ["de"] assert_equal expected, SubstringFinder.find_all(input) end def test_whitespace_substrings_are_detected input = [" ", "hello world"] expected = [" "] assert_equal expected, SubstringFinder.find_all(input) end def test_special_character_substrings_are_detected input = ["@12", "test@123.com"] expected = ["@12"] assert_equal expected, SubstringFinder.find_all(input) end # 边界场景测试用例 def test_empty_string_as_substring_is_detected input = ["", "abc"] expected = [""] assert_equal expected, SubstringFinder.find_all(input) end def test_single_element_array_returns_empty input = ["only_one_element"] expected = [] assert_equal expected, SubstringFinder.find_all(input) end def test_empty_input_array_returns_empty input = [] expected = [] assert_equal expected, SubstringFinder.find_all(input) end def test_all_elements_same_length_returns_empty input = ["same", "same", "same"] expected = [] assert_equal expected, SubstringFinder.find_all(input) end # 异常逻辑测试用例 def test_raises_argument_error_when_input_contains_number input = ["a", 123, "abc"] assert_raises ArgumentError do SubstringFinder.find_all(input) end end def test_raises_argument_error_when_input_contains_nil input = ["a", nil, "abc"] assert_raises ArgumentError do SubstringFinder.find_all(input) end end def test_raises_argument_error_when_input_contains_symbol input = ["a", :test, "abc"] assert_raises ArgumentError do SubstringFinder.find_all(input) end end end
执行 ruby substring_finder_test.rb 即可运行所有测试用例,查看执行结果。
二、测试用例数量与组织方式
用例数量
上述实现一共覆盖了16个独立测试用例,完全覆盖了原代码的所有分支逻辑、常规场景、边界场景和异常场景。如果业务有特殊需求,还可以补充多字节字符(中文、emoji)、超长字符串等场景的测试用例,最多扩展到20个左右即可实现100%覆盖。
用例组织逻辑
和Python pytest的组织逻辑类似,我们按照测试场景的类型对用例做了分类:
- 第一类是核心功能场景:覆盖子串匹配、大小写不敏感、重复元素返回等基础需求逻辑
- 第二类是边界场景:覆盖空输入、单元素输入、空字符串等极端输入场景
- 第三类是异常场景:覆盖非字符串类型输入的报错逻辑
这种分类方式后续维护成本极低,某块逻辑修改后只需要运行对应分类的用例,排查问题也能快速定位到场景类型。
内容的提问来源于stack exchange,提问作者Ikenna Sylvestre Okafor
相关产品推荐
相关产品推荐

