📜  如何知道代码失败的测试用例?

📅  最后修改于: 2021-08-25 10:24:03             🧑  作者: Mango

竞争编程中,通常会编写适用于给定样本测试用例的代码,但最终会提交带有WA (错误答案)判决的代码。这是令人沮丧的地方,并且不知道解决方案在哪个测试用例上失败。在这种情况下,程序员可以做一些事情:

  1. 手动检查极端情况
  2. 压力测试

检查角落情况

在某些问题陈述中,它包含一些极端的测试用例,程序员需要添加/编辑一些代码行,以确保程序也能在这些情况下正常运行。例如,在一个需要在数组中找到最小正整数的问题中,并且如果解决方案是这样的:

说明
上面的逻辑不会给出AC (已接受)的结论,在这里很容易找出问题所在。该代码将失败的测试案例之一是当数组为arr [] = {2,-1,3,4,5}时。上面的算法输出为-1,但正确的输出为2
为了找到最小的整数,需要编辑代码以确保包括负整数。

压力测试

压力测试是一种代码测试技术,它通过超出正常操作范围的测试来确定代码的健壮性。假设有一个天真的解决方案(慢)和一个最佳解决方案(快速)的问题在提交蛮力解决方案时获得TLE (超过时间限制)判决,因此想出了一个最佳解决方案,但是在提交该解决方案时,我们得到了WA或所有测试用例。

现在,要做的第一件事是考虑一些解决方案可能无法解决的测试案例,并检查解决方案。如果无法想到测试用例,那么还有另一种方法,那就是压力测试

压力测试中,其想法是生成随机测试用例,并检查蛮力解和最优解的输出。尽管蛮力解决方案很,但最佳解决方案更快却是正确的,但在某些测试案例中是错误的。这样一来,我们无需手动检查即可检查某些测试用例的最佳解决方案输出是否正确,而只需简单检查Naive Solution的输出是否与Optimal Solution的输出一致即可。该检查是自动完成的,并且成千上万的代码的正确性取决于测试用例的朴素解决方案(以秒为单位)的复杂性,因此发现我们的代码失败的测试用例的可能性变得很高

因此,执行以下步骤以通过运行无限循环来检查随机输入的解决方案:

  1. 生成随机输入(单击此处了解方法)
  2. 存储蛮力输出和最佳解决方案
  3. 如果两个输出(等于)比打印正确
  4. 否则打印输入并中断循环

如果循环运行了一段时间却没有中断,即所有输出都是正确的,则检查较大的输入或尝试提交解决方案。

例子:

问题陈述给定N个正整数的数组arr [] ,任务是查找数组中元素的最大成对乘积。

以下是针对上述问题的压力测试的实现:

C++
// C++ program to illustrate the stress
// testing for the above problem
#include 
using namespace std;
  
// Function that implements the Naive
// Solution for the given problem
int maxProductNaive(int a[], int n)
{
    int ans;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (i == 0 && j == 1)
                ans = a[i] * a[j];
            else if (a[i] * a[j] > ans)
                ans = a[i] * a[j];
        }
    }
    return ans;
}
  
// Function that implements the Optimal
// Solution for the given problem
int maxProductOptimal(int a[], int n)
{
    // Sort the given array
    sort(a, a + n);
  
    // Find the maximum product
    int ans = a[n - 1] * a[n - 2];
  
    // Return the product
    return ans;
}
  
// Function that performs the
// Stress Testing
void test()
{
    // Seeding random number generator
    // to get uniques values
    srand(time(0));
  
    while (1) {
  
        // Generate values for n
        // from 2 to 10
        int n = rand() % 10 + 2;
        int a[n];
  
        // Iterate over array a[]
        for (int i = 0; i < n; i++) {
  
            // Subtracting -5 will
            // generate -ve integers
            a[i] = rand() % 10 - 5;
        }
  
        // Solution using Naive Approach
        int ans_brute
            = maxProductNaive(a, n);
  
        // Solution using Optimal Approach
        int ans_optimal
            = maxProductOptimal(a, n);
  
        // If ans is correct
        if (ans_brute == ans_optimal)
            cout << "Correct\n";
  
        // Else print the WA Test Case
        else {
            cout << "Wrong Answer\n";
  
            cout << n << endl;
  
            // Print the array a[]
            for (int i = 0; i < n; i++)
                cout << a[i] << " ";
  
            cout << "\nCorrect Output: "
                 << ans_brute << endl;
  
            cout << "Wrong Output: "
                 << ans_optimal << endl;
            break;
        }
    }
}
  
// Driver Code
int main()
{
    // Function Call for Stress Testing
    test();
    return 0;
}


输出:
Wrong Answer
4
-4 -3 -3 1 
Correct Output: 12
Wrong Output: -3

说明
最佳解决方案适用于正整数,但不适用于负整数,如代码输出中所示。通过压力测试,找出了代码的问题。要为较大的输入生成并测试我们的代码,请为na [I]生成较大的整数。

简介压力测试肯定会帮助调试代码,但首先应尝试考虑代码可能无法正常工作的测试用例,因为它不太复杂,无法检查一些简单的测试用例,如果这样做没有帮助,则继续进行压力测试

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。