个性化阅读
专注于IT技术分析

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

在竞争性的编程中,经常会在给定的样例测试用例上编写代码,但在提交代码时却以WA(错误答案)裁决结束。这就是事情变得令人沮丧的地方,并且不知道解决方案在哪个测试用例上失败了。在这种情况下,程序员可以做以下几件事:

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

检查角落情况:

在某些问题陈述中, 它具有角落测试案例程序员需要的地方添加/编辑一些代码行, 以确保程序也能在这些情况下正常运行。例如, 在需要解决的问题中找出最小正整数排列成阵列如果解决方案是这样的:

int mn = arr [0]
for i:1-> arr_size:
if(arr [i] <mn)
mn = arr [i]
print mn

解释:

上面的逻辑不会给出一个AC(被接受)的结论,这里的问题很容易解决。当数组为arr[] ={2, -1, 3, 4, 5}时,这段代码将失败。上面的算法输出是-1,但正确的输出是2。

为了找到最小的正整数,它需要编辑代码以确保不包含负整数。

压力测试:

压力测试是一种代码测试技术, 可确定健壮性通过测试之外的代码极限正常运行。假设有一个问题天真的解决方案(慢)和最佳解决方案(快)得到一个标题(超过时间限制)判决提交蛮力解决方案, 所以想出了最佳解决方案, 但是提交它, 我们得到了WA在一些或所有测试用例上。

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

In压力测试的想法是生成随机测试用例, 并检查蛮力解和最优解的输出。虽然蛮力解决方案是慢仍然是正确而最佳的解决方案是快点但这在某些测试案例中是错误的。这使我们可以检查某些测试用例的最佳解决方案输出是否正确, 手动地检查, 它可以简单地检查是否输出天真的解决方案同意最佳解决方案输出。检查是自动完成的, 并且数千个代码的正确性取决于复杂的天真的解决方案数秒之内的测试用例, 因此可能性查找代码失败的测试用例的方法高.

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

  1. 生成随机输入(点击这里了解如何)
  2. 存储蛮力输出和最佳解
  3. 如果两个输出(等于)大于打印正确
  4. 否则打印输入和打破循环

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

例子:

问题陈述:给定一个Array arr []ofñ正整数, 任务是找到数组中元素的最大成对乘积.

输入:arr [] = [2、3、4、9、4、7]
输出:63
说明:
数组的最大成对乘积为9 * 7 =63。
输入:arr [] = [-20, -50 , , 1, 2]
输出:1000
说明:
数组的最大成对乘积为(-20)*(-50)= 1000。

下面是执行压力测试对于上述问题:

C ++

//C++ program to illustrate the stress
//testing for the above problem
#include <bits/stdc++.h>
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

解释:

最优解决方案适用于正整数,但不适用于负整数,如代码的输出所示。通过压力测试,找出了代码存在的问题。为了生成和测试更大输入的代码,为n和a[I]生成更大的整数。

总结: 压力测试一定会帮助调试代码, 但首先应尝试考虑代码的测试用例不得工作, 因为它少复杂检查一些简单的测试用例, 如果不帮助然后继续压力测试.


赞(0) 打赏
未经允许不得转载:srcmini » 如何知道代码失败的测试用例?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏