zoukankan      html  css  js  c++  java
  • 测试 | 信用卡号验证

    实验内容:

    信用卡号是一串长度介于13和16之间的一串数字。卡号必须是以4、5、6、或37开头,并遵循下面模式:

    1)    从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,那么就将这两位数加在一起得到一位数。

    2)    将第一步所得到的所有一位数相加

    3)    从卡号最后一位数字开始,奇数位数字相加

    4)    将第二步和第三步的到的结果相加

    5)    如果第四步得到的结果能被10整除,那么卡号是合法的,否则,卡号是不合法的。

    package org.test;
    
    import java.util.Scanner;
    
    public class CreditCard {
      
      /** Return true if the card number is valid */
      public boolean isValid(long number) {
        return  (getSize(number) >= 13) && (getSize(number) <= 16) && 
            (prefixMatched(number, 4) || prefixMatched(number, 5) ||
            prefixMatched(number, 6) || prefixMatched(number, 37)) && 
           (sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0;
      }
    
      /** Get the result from Step 2 */
      public int sumOfDoubleEvenPlace(long number) {
        int result = 0;
        
        number = number / 10; // Starting from the second digit from left
        while (number != 0) {
          result += getDigit((int)((number % 10) * 2));
          number = number / 100; // Move to the next even place
        }
        
        return result;
      }
      
      /** Return this number if it is a single digit, otherwise, return 
       * the sum of the two digits */
      public int getDigit(int number) {
        return number % 10 + (number / 10);
      }
      
      /** Return sum of odd place digits in number */
      //3)	从卡号最后一位数字开始,奇数位数字相加
      public int sumOfOddPlace(long number) {
        int result = 0;
       
        while (number != 0) {
          result += (int)(number % 10);
          number = number / 100; // Move two positions to the left
        }
        
        return result;
      }
      
      /** Return true if the digit d is a prefix for number */
      public boolean prefixMatched(long number, int d) {
        return getPrefix(number, getSize(d)) == d;
      }
      
      /** Return the number of digits in d */
      public int getSize(long d) {
        int numberOfDigits = 0;
        
        while (d != 0) {
          numberOfDigits++;
          d = d / 10;
        }
        
        return numberOfDigits;
      }
      
      /** Return the first k number of digits from number. If the number
       * of digits in number is less than k, return number. */
      public long getPrefix(long number, int k) {
        long result = number;
        
        for (int i = 0; i < getSize(number) - k; i++)
          result /= 10;
        
        return result;
      }
    }
    

      

    参数化 && 覆盖率100% 测试设计:

    package org.test;
    
    import static org.junit.Assert.*;
    
    import java.util.Arrays;
    import java.util.Collection;
    
    import org.junit.After;
    import org.junit.AfterClass;
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized;
    import org.junit.runners.Parameterized.Parameters;
    
    @RunWith(Parameterized.class)  
    public class CreditCardTest {
    
    	CreditCard creditCard;
    	private long input;
    	private int sumOfOddPlaceExpected;
    	private int digitExpected;
    	private int sumOfDoubleEvenPlaceExpected;
    	private boolean isValidExpected;
    	 @Parameters  
    	 @SuppressWarnings("unchecked")  
    	  public static Collection prepareData1(){  
    	        Object[][] object = {
    	        		{4111111111111111L,8,8,22,true},
    	        		{38520000023237L,21,3,19,false},
    	        		{6011000000000004L,5,5,5,true},
    	        		{100000000L,1,1,0,false},
    	        		{10000000000000000L,1,1,0,false},
    	        		{371449635398431L,33,6,47,true},
    	        		{5111111111111198L,15,6,22,false}
    	               };  
    	       
    	       return Arrays.asList(object);  
    	   } 
    	
    	 public CreditCardTest(long input,int sumOfOddPlaceExpected,int digitExpected,
    			 int sumOfDoubleEvenPlaceExpected,boolean isValidExpected){  
    	        this.input = input;  
    	        this.sumOfOddPlaceExpected = sumOfOddPlaceExpected;  
    	        this.digitExpected = digitExpected;
    	        this.sumOfDoubleEvenPlaceExpected = sumOfDoubleEvenPlaceExpected;
    	        this.isValidExpected = isValidExpected;
    	 }
    	 	
    	@Before
    	public void setUp() throws Exception {
    		 creditCard = new CreditCard();
    	}
    
    	//检验信用卡号
    	@Test
    	public void testIsValid() {
    		boolean result = creditCard.isValid(input);
    		Assert.assertEquals(isValidExpected,result);
    	}
    
    	//从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,那么就将这两位数加在一起得到一位数。
    	@Test
    	public void testSumOfDoubleEvenPlace() {
    		int result = creditCard.sumOfDoubleEvenPlace(input);
    		Assert.assertEquals(result, sumOfDoubleEvenPlaceExpected);
    	}
    
    	//如果两位数,那么就将这两位数加在一起得到一位数,否则返回本身
    	@Test
    	public void testGetDigit() {
    		int result = creditCard.getDigit(sumOfOddPlaceExpected);
    		Assert.assertEquals(digitExpected, result);
    	}
    
    	//3)从卡号最后一位数字开始,奇数位数字相加
    	@Test
    	public void testSumOfOddPlace() {
    		 int result = creditCard.sumOfOddPlace(input);
    	     Assert.assertEquals(sumOfOddPlaceExpected,result);  
    	}
    
    }
    

      

      

  • 相关阅读:
    弹出窗口的几种方法
    FCKeditor2.2+ASP.NET2.0不完全攻略
    如何运用 Form 表单认证 ?
    DataGrid的多种格式化显示方法
    如何显示在线人数,和所在位置?? [转自作者:子扬]
    备份和恢复Active Directory
    如何在vs.net里调试脚本 《一》
    初学ASP.Net时一些备忘的东西
    ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题
    小技巧(一)分离字符串string str="(1,10,100,1000,10000,)";
  • 原文地址:https://www.cnblogs.com/jj81/p/9896745.html
Copyright © 2011-2022 走看看