输入
下面一段代码生成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%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。