#test-cases #markdown #write #testing #foo #bar #merge-serialized

testcase-markdown

A Rust 工具,用于用 Markdown 编写测试用例

1 个不稳定版本

0.0.1 2023年5月8日

#60 in #bar


用于 querydown

MIT 许可证

11KB
184

Testcase Markdown

这是一个小型工具,允许你在 Markdown 文件中编写 Rust 代码的测试用例。如果你正在管理大量针对在字符串上操作(如解析器、格式化器、转换器等)的代码的测试用例,这可能很有用。

用法

  1. 用 Markdown 编写一些测试用例

    # Tests
    
    ```toml options
    foo = 42
    bar = "This options value gets carried through to all tests in child headings"
    ```
    
    ## The first test
    
    ```
    This is the first argument
    ```
    
    ```
    This is the second argument
    ```
    
    ## The second test
    
    ```toml options
    bar = "This is a new options value to be used only within this test"
    ```
    
    ```
    Argument
    ```
    
    ```
    blah blah
    ```
    
  2. 在 Markdown 中

    • 使用标题来组织你的测试。你可以随意嵌套它们。
    • 使用 options 标记代码块以将它们传递给选项序列化器。选项将被继承到子标题下的测试中。
    • 通过其他代码块(即 标记为 options)传递给测试的位置参数。这些代码块可以与任何语言关联。
    • 标题和代码块是解析器关心的唯一内容。如果你想,可以使用段落为测试添加注释。
  3. 编写读取 Markdown 的测试

    #[cfg(test)]
    mod tests {
        use super::*;
        use testcase_markdown::{get_test_cases, MergeSerialized, TestCase};
        use std::path::PathBuf;
        use toml::{from_str, Table};
    
        #[derive(Default, PartialEq, Eq, Debug, Clone, Copy)]
        struct Options {
            foo: i64,
            bar: bool,
        }
    
        impl MergeSerialized for Options {
            fn merge_serialized(&self, source: String) -> Result<Self, String> {
                // Write some logic here to deserialize your options and merge them
                // with higher-level options.
                let values = from_str::<Table>(&source).map_err(|e| e.to_string())?;
                Ok(Options {
                    foo: values
                        .get("foo")
                        .and_then(|v| v.as_integer())
                        .unwrap_or(self.foo),
                    bar: values
                        .get("bar")
                        .and_then(|v| v.as_bool())
                        .unwrap_or(self.bar),
                })
            }
        }
    
        #[test]
        fn test_basic() {
            let markdown_content = get_your_markdown_content_from_a_file_or_elsewhere();
            let test_cases = get_test_cases(markdown_content, Options::default());
            for test_case in test_cases {
                // Run your test logic here
            }
        }
    }
    
  4. 在你的测试中,每个测试用例看起来像这样

    pub struct TestCase<Options> {
        pub name: String,
        pub headings: Vec<String>,
        pub line_number: usize,
        pub options: Options,
        pub args: Vec<String>,
    }
    

依赖

~1MB
~29K SLoC