需要测试用例才能达到 85% 的测试覆盖率

Need test cases to achieve 85% test coverage

提问人:LMReddy 提问时间:10/31/2023 最后编辑:James ZLMReddy 更新时间:11/1/2023 访问量:35

问:

在部署 spring boot 应用程序时,我遇到了声纳扫描问题。为了解决这个问题,我需要写出 85% 的测试覆盖率。我为我的服务层写了一些测试用例,但测试覆盖率的结果仍然是 72.1%。我想要一些测试用例,我可以将它们添加到我的服务层测试中。

JoinQueryService 层:

@Service
public class JoinQueryService {

    @Resource
    private EmployeeRepository employeeRepository;

    public List<DeptEmpDto> getCrediProduct(DeptEmpDto input) {
        List<DeptEmpDto> list=null;
        if (!input.getEmpName().isEmpty() && input.getEmpEmail().isEmpty()){
            list = employeeRepository.fetchEmpDeptDataInnerJoinByName(input.getEmpName());
        }else if(input.getEmpName().isEmpty() && !input.getEmpEmail().isEmpty()){
            list = employeeRepository.fetchEmpDeptDataInnerJoinByEmail(input.getEmpEmail());
        }else if(!input.getEmpName().isEmpty() && !input.getEmpEmail().isEmpty()){
            list = employeeRepository.fetchEmpDeptDataInnerJoin(input.getEmpName(), input.getEmpEmail());
        }else {
            throw new EmployeeDataNotFoundException();
        }
        return list;
    }

    public String deleteCreditProduct(DeptEmpDto input){
        if (!input.getEmpName().isEmpty() && input.getEmpEmail().isEmpty()){
            employeeRepository.deleteEmpDeptDataInnerJoinByName(input.getEmpName());
        }else if(input.getEmpName().isEmpty() && !input.getEmpEmail().isEmpty()){
            employeeRepository.deleteEmpDeptDataInnerJoinByEmail(input.getEmpEmail());
        }else if(!input.getEmpName().isEmpty() && !input.getEmpEmail().isEmpty()){
            employeeRepository.deleteEmpDeptDataInnerJoin(input.getEmpName(), input.getEmpEmail());
        }else {
            throw new EmployeeDataNotFoundException();
        }
        return "Deleted Successfully";
    }

}

这已经为我的服务测试层编写了测试用例。

@RunWith(MockitoJUnitRunner.class)
public class JoinQueryServiceTest {

    @Mock
    private EmployeeRepository mockEmployeeRepository;

    @InjectMocks
    private JoinQueryService joinQueryServiceUnderTest;

    @Test
    public void testGetCrediProduct() {
        // Setup
        final DeptEmpDto input = new DeptEmpDto("empDept", "empName", "empEmail", "empAddress");

        // Configure EmployeeRepository.fetchEmpDeptDataInnerJoinByName(...).
        final List<DeptEmpDto> list = List.of(new DeptEmpDto("empDept", "empName", "empEmail", "empAddress"));
        when(mockEmployeeRepository.fetchEmpDeptDataInnerJoinByName("empName")).thenReturn(list);

        // Configure EmployeeRepository.fetchEmpDeptDataInnerJoinByEmail(...).
        final List<DeptEmpDto> list1 = List.of(new DeptEmpDto("empDept", "empName", "empEmail", "empAddress"));
        when(mockEmployeeRepository.fetchEmpDeptDataInnerJoinByEmail("empEmail")).thenReturn(list1);

        // Configure EmployeeRepository.fetchEmpDeptDataInnerJoin(...).
        final List<DeptEmpDto> list2 = List.of(new DeptEmpDto("empDept", "empName", "empEmail", "empAddress"));
        when(mockEmployeeRepository.fetchEmpDeptDataInnerJoin("empName", "empEmail")).thenReturn(list2);

        // Run the test
        final List<DeptEmpDto> result = joinQueryServiceUnderTest.getCrediProduct(input);

        // Verify the results
    }

    @Test
    public void testGetCrediProduct_EmployeeRepositoryFetchEmpDeptDataInnerJoinByNameReturnsNoItems() {
        // Setup
        final DeptEmpDto input = new DeptEmpDto("empDept", "empName", "empEmail", "empAddress");
        when(mockEmployeeRepository.fetchEmpDeptDataInnerJoinByName("empName")).thenReturn(Collections.emptyList());

        // Run the test
        final List<DeptEmpDto> result = joinQueryServiceUnderTest.getCrediProduct(input);

        // Verify the results
        assertEquals(Collections.emptyList(), result);
    }

    @Test
    public void testGetCrediProduct_EmployeeRepositoryFetchEmpDeptDataInnerJoinByEmailReturnsNoItems() {
        // Setup
        final DeptEmpDto input = new DeptEmpDto("empDept", "empName", "empEmail", "empAddress");
        when(mockEmployeeRepository.fetchEmpDeptDataInnerJoinByEmail("empEmail")).thenReturn(Collections.emptyList());

        // Run the test
        final List<DeptEmpDto> result = joinQueryServiceUnderTest.getCrediProduct(input);

        // Verify the results
        assertEquals(Collections.emptyList(), result);
    }

    @Test
    public void testGetCrediProduct_EmployeeRepositoryFetchEmpDeptDataInnerJoinReturnsNoItems() {
        // Setup
        final DeptEmpDto input = new DeptEmpDto("empDept", "empName", "empEmail", "empAddress");
        when(mockEmployeeRepository.fetchEmpDeptDataInnerJoin("empName", "empEmail")).thenReturn(
                Collections.emptyList());

        // Run the test
        final List<DeptEmpDto> result = joinQueryServiceUnderTest.getCrediProduct(input);

        // Verify the results
        assertEquals(Collections.emptyList(), result);
    }

    @Test
    public void testDeleteCreditProduct() {
        // Setup
        final DeptEmpDto input = new DeptEmpDto("empDept", "empName", "empEmail", "empAddress");

        // Run the test
        final String result = joinQueryServiceUnderTest.deleteCreditProduct(input);

        // Verify the results
        assertEquals("Deleted Successfully", result);
        verify(mockEmployeeRepository).deleteEmpDeptDataInnerJoinByName("empName");
        verify(mockEmployeeRepository).deleteEmpDeptDataInnerJoinByEmail("empEmail");
        verify(mockEmployeeRepository).deleteEmpDeptDataInnerJoin("empName", "empEmail");
    }
}

我想要更多的测试用例来解决我的问题,覆盖率应该至少从 72.1% 增加到 85%。 请根据上面的服务层为我提供更多测试用例。

休息 spring-data-jpa mockito junit4

评论

3赞 Alexander 10/31/2023
“请根据上述服务层为我提供更多测试用例。”这完全没有抓住测试的重点。编写适合现有代码的测试就像在尺子上做新的标记,以完全匹配你已经切割过的木板。当然,两者现在匹配,但价值非常小。

答:

0赞 Timur Celikel 10/31/2023 #1

仅看代码就很难确定这一点。

但是,有一个很棒的 IDE 插件,称为 SonarLint,它将在粒度级别生成测试覆盖率报告。

步骤 1。在您喜欢的 IDE 中安装 SonarLint 插件。

第2步。“有覆盖率”运行应用程序enter image description here

第 3 步。查看测试覆盖率报告enter image description here

评论

0赞 LMReddy 10/31/2023
谢谢,但上面的测试用例它完全涵盖了这个方法:list = employeeRepository.fetchDeptDataInnerJoin(input.getEmpName(), input.getEmpEmail());其余方法未涵盖,它在 sonaarLint 中显示。我也需要帮助来涵盖其余方法。
2赞 Timur Celikel 10/31/2023
你知道在你的测试中,你实际上并没有测试任何东西,对吗?仅仅断言一个空列表并没有做任何事情。该工具可能会给你一种错误的安全感,认为你有很高的测试覆盖率,但任何真正看过测试的人都会意识到他们什么也没做。我强烈建议您阅读如何使用 JUnit 和 Mockito 编写有效的测试,现在忽略百分比。10% 的测试覆盖率和良好的测试比 85% 的覆盖率要好,而测试实际上并没有测试任何东西。