【问题标题】:How to test a stack of n elements?如何测试一堆 n 个元素?
【发布时间】:2023-04-04 18:35:01
【问题描述】:

这似乎是一个愚蠢的问题,但我真的很喜欢你的 cmets,并想验证我的测试人员的想法..

I can think of following test cases:
1) Pop element from empty stack should return error
2) Push n+1 elements in stack should return error during insertion of n+1th element
3) validate empty,full and top functions of stack.
4) if stack is used in multithreaded environment , make sure it is synchronized.
5) validate stack functionality: 
    push element (x)
    pop element: it should return x

评论?

如果在面试中问到这个问题,可能的答案是什么? 我的回答够有效吗?

【问题讨论】:

    标签: testing


    【解决方案1】:

    我认为您已经涵盖了所有内容,除了可能签入 3) 之前推送的 n 元素是您所期望的。这将捕获错误的边界条件检查,即仅在写入新元素后检查堆栈是否已满。

    此外,我会对您的测试用例进行不同的分组,并为每个测试用例测试 top、pop、push、empty、full:

    1. 空栈
    2. 堆叠只有一个元素*
    3. 与一些元素堆叠,可能调用 pop/push 两次或更频繁
    4. 堆栈几乎已满(n-1 个元素)*
    5. 全栈

    *没有必要,但可能是极端情况。

    【讨论】:

      【解决方案2】:

      我觉得不错。只需确保在验证功能时,确保多个项目以正确的顺序返回,每次弹出和推送后 top 正常工作,并且在弹出最后一个元素后正确报告为空。

      【讨论】:

        【解决方案3】:

        我会增强 (5) 以阅读: 推送 N 个不同的元素, 弹出N次并确保以相反的顺序检索相同的元素

        检查这些词是否代表已排序列表、反向排序列表和未排序列表中的元素也是谨慎的做法。

        【讨论】:

          【解决方案4】:

          你想对此感到非常神经质吗?确认数据结构的性能总是很有趣的。堆栈应该具有​​恒定的性能。因此,对于 [0,n-1) 中的每个 k,您可以推送 k 个元素,然后将第 (k+1) 个元素推送和弹出 1e8 次,并确保时间具有可比性。我可以想象几个脑死的实现,其中元素 n-1 的推送和弹出时间是元素 0 的 n 倍。

          【讨论】:

            【解决方案5】:

            如果除了 push 和 pop 之外还有其他方法(例如length and top),也请测试一下。

            对于顶部,测试:

            • 空堆栈(错误)
            • 完整堆栈(第 n 个元素)
            • 重复调用(应返回与未删除元素相同的值)

            关于长度,测试:

            • 空栈
            • 全栈
            • 行为后推(加一)
            • post pop(减一)
            • 行为帖子顶部(无变化)
            • 在空堆栈上发布弹出消息(零)
            • 全栈后推 (n)。

            【讨论】:

              【解决方案6】:

              我还会将数字 101 推到 100+n,然后将它们全部弹出以确保它们以相反的顺序弹出(会发现排序问题,例如“有时弹出会得到第二个元素而不是第一个元素”)。

              以下序列应该彻底测试除多线程需求之外的所有需求:

              • 空代表真。
              • full 给出 false。
              • pop 给出错误。
              • top 给出错误(我假设这是一个 peek 操作)。
              • 对于 n = 101 到 100+sz-1:
                • 推送 n 个作品。
                • top 给出 n.
                • empty 给出 false。
                • full 给出 false。
              • 推送 100+sz 作品。
              • 顶部提供 100+sz。
              • empty 给出 false。
              • 完全正确。
              • 按 99 会出错。
              • 顶部提供 100+sz。
              • empty 给出 false。
              • 完全正确。
              • 对于 n = 100+sz 到 102:
                • pop 给 n.
                • top 给出 n - 1。
                • empty 给出 false。
                • full 给出 false。
              • pop 给出 101。
              • 顶部给出错误。
              • 空代表真。
              • full 给出 false。
              • pop 给出错误。

              【讨论】:

                【解决方案7】:

                多线程:最好编写一个测试,其中至少有 3 个线程同时敲击数据结构。并确保您在多处理器机器上运行它,这样您才能获得真正的并发性,而不仅仅是时间切片。

                并且不要忘记以下情况:

                if( !stack.Empty )
                {
                    // oops, another thread emptied the stack and now this call will throw an error:
                    stack.Pop();
                }
                

                【讨论】:

                  【解决方案8】:

                  来自 cmets 的好的

                  堆栈的测试可以分为

                  Functionality testing
                  Performance testing
                  Security testing: if data pushed onto stack are strings , then we may need to check for buffer overflows
                  

                  【讨论】:

                    【解决方案9】:

                    我认为还有一件最简单的事情值得人们关注。 Stack 是一个 LIFO 数据结构,所以如果你用给定“a,b,c,d.......w”的项目序列填充(随后推送)给定的堆栈,你应该得到相反的序列(w ,....,d,c,b,a) 当您弹出堆栈的所有元素时。应该有人检查堆栈的主要属性是否正确。

                    【讨论】:

                      【解决方案10】:

                      如果您正在谈论编写测试用例来确定堆栈是否为空,那么就是这样

                      public class LinkStackTest {
                      protected StackInterface<String> stack;
                      protected int size;
                      @Before public void setUp() {
                      stack = new LinkStack<String>();
                      }
                      @Test public void empty() {
                      assertTrue(stack.isEmpty());
                      assertEquals(0, stack.size());
                      }
                      

                      【讨论】:

                        猜你喜欢
                        • 2016-07-02
                        • 2010-09-20
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-09-09
                        • 2015-04-08
                        • 2016-12-14
                        • 2019-12-16
                        • 2014-10-29
                        相关资源
                        最近更新 更多