< 返回版块

warycat 发表于 2021-01-02 05:23

我发现刷题网站的rust解答非常少,所以在学习rust之余,将答案整理成一个网站rustgym.com,为rust社区做点小贡献。因为水平有限没能赶在年底刷完所有hard题目,剩下hard留到了新年。

如果有rust工作岗位机会,请联系我,加我微信xiayinchu. 或手机+1(626)628-6332 祝新年快乐!


Ext Link: https://rustgym.com

评论区

写评论
作者 warycat 2021-01-04 16:15

看来是个人偏好吧,我用ctrl-c ctrl-v习惯了。然后在代码中加dbg找bug,顺手还可以将多行其他测试注释了。还有一个好处是在CI环境下并不能使用调试,分开写也有助于报错可读性。

--
👇
ruby: 我不太赞同

如果在循环中报错,找到特定测试会困难些。

如果单元测试是一个数组,可以在循环里用dbg!打印测试用例和期待值,很容易定位到失败的测试用例

而且数组化管理测试用例,我还可以将出错的测试用例挪到第一位,优先测试上次出错的

我的做题习惯就是先写上题目描述里的测试用例,提交wrong answer时把出错的测试用例插入到测试用例数组的第一项,优先测试近期出错的用例

--
👇
warycat: 分开写测试的好处是不同的行数报错可以快速找到出错行,这样测试之间是隔离的。如果在循环中报错,找到特定测试会困难些。

ruby 2021-01-04 15:37

我不太赞同

如果在循环中报错,找到特定测试会困难些。

如果单元测试是一个数组,可以在循环里用dbg!打印测试用例和期待值,很容易定位到失败的测试用例

而且数组化管理测试用例,我还可以将出错的测试用例挪到第一位,优先测试上次出错的

我的做题习惯就是先写上题目描述里的测试用例,提交wrong answer时把出错的测试用例插入到测试用例数组的第一项,优先测试近期出错的用例

--
👇
warycat: 分开写测试的好处是不同的行数报错可以快速找到出错行,这样测试之间是隔离的。如果在循环中报错,找到特定测试会困难些。

作者 warycat 2021-01-04 11:50

分开写测试的好处是不同的行数报错可以快速找到出错行,这样测试之间是隔离的。如果在循环中报错,找到特定测试会困难些。

--
👇
ruby: 提一个建议,您可以测试用例写成一个数组,这样方便管理测试用例也避免了重复代码 例如:

#[test]
fn test_kth_to_last() {
    const TEST_CASES: [(&[i32], i32, i32); 2] = [
        (&[1, 2, 3, 4, 5], 2, 4),
        (&[1], 1, 1)
    ];
    for &(nums, k, output) in TEST_CASES.iter() {
        assert_eq!(kth_to_last(super::arr_to_linked_list(nums), k), output);
    }
}

像您1669的测试用例

#[test]
fn test() {
    let list1 = list![0, 1, 2, 3, 4, 5];
    let a = 3;
    let b = 4;
    let list2 = list![1000000, 1000001, 1000002];
    let res = list![0, 1, 2, 1000000, 1000001, 1000002, 5];
    assert_eq!(Solution::merge_in_between(list1, a, b, list2), res);
    let list1 = list![0, 1, 2, 3, 4, 5, 6];
    let a = 2;
    let b = 5;
    let list2 = list![1000000, 1000001, 1000002, 1000003, 1000004];
    let res = list![0, 1, 1000000, 1000001, 1000002, 1000003, 1000004, 6];
    assert_eq!(Solution::merge_in_between(list1, a, b, list2), res);
}

建议写成:

#[test]
fn test() {
    for &(list1, a, b, list2, excepted_output) in &TEST_CASES
    // ...
}

这是我刷题的github代码仓库的单元测试示例,可以参考下

顺便感谢您实现的vec_vec_i32!宏,生成二维矩阵很方便,我用的是解析二维矩阵字符串成Vec<Vec>很傻瓜,准备将所有矩阵的测试用例的生成方法成您的vec_vec_i32!宏

ruby 2021-01-04 11:18

提一个建议,您可以测试用例写成一个数组,这样方便管理测试用例也避免了重复代码 例如:

#[test]
fn test_kth_to_last() {
    const TEST_CASES: [(&[i32], i32, i32); 2] = [
        (&[1, 2, 3, 4, 5], 2, 4),
        (&[1], 1, 1)
    ];
    for &(nums, k, output) in TEST_CASES.iter() {
        assert_eq!(kth_to_last(super::arr_to_linked_list(nums), k), output);
    }
}

像您1669的测试用例

#[test]
fn test() {
    let list1 = list![0, 1, 2, 3, 4, 5];
    let a = 3;
    let b = 4;
    let list2 = list![1000000, 1000001, 1000002];
    let res = list![0, 1, 2, 1000000, 1000001, 1000002, 5];
    assert_eq!(Solution::merge_in_between(list1, a, b, list2), res);
    let list1 = list![0, 1, 2, 3, 4, 5, 6];
    let a = 2;
    let b = 5;
    let list2 = list![1000000, 1000001, 1000002, 1000003, 1000004];
    let res = list![0, 1, 1000000, 1000001, 1000002, 1000003, 1000004, 6];
    assert_eq!(Solution::merge_in_between(list1, a, b, list2), res);
}

建议写成:

#[test]
fn test() {
    for &(list1, a, b, list2, excepted_output) in &TEST_CASES
    // ...
}

这是我刷题的github代码仓库的单元测试示例,可以参考下

顺便感谢您实现的vec_vec_i32!宏,生成二维矩阵很方便,我用的是解析二维矩阵字符串成Vec<Vec>很傻瓜,准备将所有矩阵的测试用例的生成方法成您的vec_vec_i32!宏

1 共 4 条评论, 1 页