ChatGPT与单元测试

2793 篇文章 4 订阅
2642 篇文章 26 订阅
文章介绍了用于软件测试面试准备的小程序,包含基础题、自动化测试、大厂面试真题等内容,展示了JUnit4和JUnit5的单元测试用例编写,以及如何使用Mockito进行Mock对象测试,帮助读者提升面试技能和找到工作。
摘要由CSDN通过智能技术生成

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)-CSDN博客文章浏览阅读919次,点赞43次,收藏6次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块……https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.55011 Java计算器   

输入  

下面一段代码生成JUnit4架构的单元测试用例

package com.jerry;
public class Calculator{
    private static int result;
    public void add(int n) {
        result = result + n;
    }
    public void substract(int n) {
        result = result - n; 
    }
    public void multiply(int n) {
           result = result * n;
    } 
    public void divide(int n){
           try {
                  result = result / n;    
           }catch(ArithmeticException ex){
                  System.out.println(ex);
                  throw new ArithmeticException("The n not allowed to 0!!");
           }
    }
}

ChatGPT回答  

以下是使用JUnit5架构生成的单元测试用例:

package com.jerry;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
    private Calculator calculator;
    @BeforeEach
    public void setUp() {
        calculator = new Calculator();
        calculator.result = 10; // 初始化result为10
    }
    @Test
    public void testAdd() {
        calculator.add(5);    
        assertEquals(15, calculator.result);
    }
    @Test
    public void testSubstract() {
        calculator.substract(3);
        assertEquals(7, calculator.result);
    }
    @Test
    public void testMultiply() {
        calculator.multiply(2);
        assertEquals(20, calculator.result);
    }
    @Test
    public void testDivide() {
        calculator.divide(2);
        assertEquals(10, calculator.result);
    }
    @Test
    public void testDivideByZero() {
        ArithmeticException exception = assertThrows(ArithmeticException.class, () -> {
            calculator.divide(0);    
        });
        assertEquals("The n not allowed to 0!!", exception.getMessage());
    }
}

在这个示例中,我们创建了一个名为CalculatorTest的单元测试类,使用了JUnit5的注解@BeforeEach和@Test来初始化测试环境和编写测试用例。在每个测试用例中,我们调用Calculator类的方法,并使用断言来验证结果是否符合预期。同时,我们还编写了一个测试用例来验证除以0的情况是否会抛出ArithmeticException异常,并检查异常消息是否正确。

希望这个示例对你有所帮助!

运行代码  

testDivide() 有错误

修改代码 

assertEquals(5, calculator.result);

修改完毕正确

2 Java Mock的使用  

输入  

对下面Account.java、AccountManager.java AccountService.java 3个文件书写基于JUnit5和Mockito的单元测试用例

Account.java   

package com.Account.JUnit5Project;
           
public class Account
{
    private String accountId;
    private long balance;
    public Account(String accountId, long initialBalance)
{
        this.accountId = accountId;
        this.balance = initialBalance;
    }
    //借记
    public void debit( long amount )
{
        this.balance -= amount;
    }
    //信用
    public void credit( long amount )
{
        this.balance += amount;
    }
    public long getBalance()    
{
        return this.balance;
    }
}

AccountManager.java

AccountService.java

package com.Account.JUnit5Project;
import com.Account.JUnit5Project.Account;
import com.Account.JUnit5Project.AccountManager;
public class AccountService
{
       //使用的账户管理器实现
    private AccountManager accountManager;
           
    //设置账户管理器实现的设置方法    
    public void setAccountManager( AccountManager manager )
{
        this.accountManager = manager;
    }
    //一个设置客户经理实现从账户到账户的senderId beneficiaryId setter方法。
    //senderId:转出方Id
    //beneficiaryId:收益方Id
    //amount:金额
    public void transfer( String senderId, String beneficiaryId, long amount )
{
        //初始化转出方与收益方,findAccountForUser为接口类方法
           Account sender = this.accountManager.findAccountForUser( senderId );
        Account beneficiary = this.accountManager.findAccountForUser( beneficiaryId );
        //转入和收益
        sender.debit( amount );
        beneficiary.credit( amount );
        //更新,updateAccount为接口类方法
        this.accountManager.updateAccount( sender );
        this.accountManager.updateAccount( beneficiary );
    }    
}

ChatGPT回答  

下面是基于JUnit5和Mockito的单元测试用例,分别针对Account.java、AccountManager.java和AccountService.java这三个类进行测试。

package com.Account.JUnit5Project;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
public class AccountTest {
    private Account account;
    @BeforeEach
    public void setUp() {
        account = new Account("12345", 1000);
    }
    @Test
    public void testDebit() {
        account.debit(500);
        assertEquals(500, account.getBalance());
    }
    @Test
    public void testCredit() {    
        account.credit(200);
        assertEquals(1200, account.getBalance());
    }
}
package com.Account.JUnit5Project;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
public class AccountServiceTest {
    private AccountService accountService;
    private AccountManager accountManager;
    @BeforeEach
    public void setUp() {
        accountService = new AccountService();
        accountManager = mock(AccountManager.class);
        accountService.setAccountManager(accountManager);
    }
    @Test
    public void testTransfer() {
        Account sender = new Account("sender123", 1000);
        Account beneficiary = new Account("beneficiary456", 2000);
        when(accountManager.findAccountForUser("sender123")).thenReturn(sender);    
     when(accountManager.findAccountForUser("beneficiary456")).thenReturn(beneficiary);
        accountService.transfer("sender123", "beneficiary456", 500);
        assertEquals(500, sender.getBalance());
        assertEquals(2500, beneficiary.getBalance());
        verify(accountManager, times(1)).updateAccount(sender);
        verify(accountManager, times(1)).updateAccount(beneficiary);
    }
}

在这里,我们使用了JUnit5的注解@BeforeEach和@Test来初始化测试环境和编写测试用例。同时,使用了Mockito来模拟AccountManager接口的实现,并对AccountService的transfer方法进行测试。

希望这个示例对你有所帮助!

运行代码  

没有定义

import org.junit.jupiter.api.BeforeEach;

修改代码  

加上import org.junit.jupiter.api.BeforeEach;    

测试通过

3 Python计算器  

unittest架构  

输入  

下面代码生成unittest架构的单元测试用例

#!/usr/bin/env python
#coding:utf-8
__metaclass_=type
class calculator:
    def __init__(self,result):
        self.result=int(result)
    def add(self,n):
        self.result = self.result + n
    def subs(self,n):
        self.result = self.result - n
    def multiply(self,n):
        self.result = self.result * n
    def divide(self,n):
        try:
            self.result = self.result/n    
        except ZeroDivisionError:
            print ("除数不能为零")
            self.result = 0
    def getResult(self):
        return self.result;
    def clear(self):
        self.result = 0;

ChatGPT回答  

import unittest
from calculator import calculator
class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calc = calculator(10)
    def test_add(self):
        self.calc.add(5)
        self.assertEqual(self.calc.getResult(), 15)
    def test_subs(self):
        self.calc.subs(3)
        self.assertEqual(self.calc.getResult(), 7)
    def test_multiply(self):
        self.calc.multiply(2)
        self.assertEqual(self.calc.getResult(), 20)    
    def test_divide(self):
        self.calc.divide(2)
        self.assertEqual(self.calc.getResult(), 5)
    def test_divide_by_zero(self):
        self.calc.divide(0)
        self.assertEqual(self.calc.getResult(), 0)
    def test_clear(self):
        self.calc.clear()
        self.assertEqual(self.calc.getResult(), 0)
if __name__ == '__main__':
unittest.main()

请注意,这段代码假设已经有一个名为calculator的类定义在calculator.py文件中。测试用例中的setUp方法用于初始化calculator实例,test_add、test_subs、test_multiply、test_divide、test_divide_by_zero和test_clear分别对calculator类的各个方法进行测试。

运行  

测试通过

pytest架构  

输入  

下面代码生成pytest架构的单元测试用例

#!/usr/bin/env python    
#coding:utf-8
__metaclass_=type
class calculator:
    def __init__(self,result):
        self.result=int(result)
    def add(self,n):
        self.result = self.result + n
    def subs(self,n):
        self.result = self.result - n
    def multiply(self,n):
        self.result = self.result * n
    def divide(self,n):
        try:
            self.result = self.result/n
        except ZeroDivisionError:
            print ("除数不能为零")
            self.result = 0
    def getResult(self):
        return self.result;
    def clear(self):
        self.result = 0;    

ChatGPT回答  

下面是将给定的计算器类转换为pytest架构的单元测试用例的代码示例:

import pytest
class TestCalculator:
    @pytest.fixture
    def calculator_instance(self):
        from your_module import calculator  # 将your_module替换为你的模块名
        calc = calculator(10)  # 假设初始结果为10
        yield calc
    def test_add(self, calculator_instance):
        calculator_instance.add(5)
        assert calculator_instance.getResult() == 15
    def test_subs(self, calculator_instance):
        calculator_instance.subs(3)
        assert calculator_instance.getResult() == 7
    def test_multiply(self, calculator_instance):
        calculator_instance.multiply(2)
        assert calculator_instance.getResult() == 20
    def test_divide(self, calculator_instance):
        calculator_instance.divide(5)
        assert calculator_instance.getResult() == 2    
    def test_divide_by_zero(self, calculator_instance):
        calculator_instance.divide(0)
        assert calculator_instance.getResult() == 0
    def test_clear(self, calculator_instance):
        calculator_instance.clear()
        assert calculator_instance.getResult() == 0

在这个示例中,我们使用pytest的@pytest.fixture装饰器创建了一个fixture,用于实例化计算器类。然后,我们定义了多个测试方法,每个方法对应计算器类的不同功能,并使用assert语句来验证计算结果是否符合预期。请将your_module替换为你的模块名。

修改代码 

from your_module import calculator  # 将your_module替换为你的模块名

改为

from alculator import calculator

运行  

测试通过

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 786229024,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】在这里插入图片描述
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值