Java源代码Printtokens2.java单元测试用例设计及代码覆盖率分析
Java源代码Printtokens2.java单元测试用例设计及代码覆盖率分析
目标: 针对给定的Printtokens2.java文件,设计足够多且合理的单元测试用例,并使用JUnit单元测试工具运行这些测试用例,以触发源代码中的全部或大部分bug。
方法: 基于控制流图CFG的逻辑覆盖策略,对Printtokens2.java中的每个待测函数进行测试用例设计。
报告内容:
-
单元测试用例的设计方案
- main函数 * 测试输入参数为空的情况 * 测试输入参数为一个不存在的文件路径的情况 * 测试输入参数为一个存在的文件路径但文件内容为空的情况 * 测试输入参数为一个存在的文件路径且文件内容为正常输入的情况 * isDelimiter函数 * 测试输入字符为分隔符的情况 * 测试输入字符不为分隔符的情况 * isWhitespace函数 * 测试输入字符为空格的情况 * 测试输入字符为空格以外的情况 * isNumber函数 * 测试输入字符串为数字的情况 * 测试输入字符串为非数字的情况 * getToken函数 * 测试输入字符为分隔符的情况 * 测试输入字符不为分隔符的情况 * 测试输入字符为空格的情况 * 测试输入字符为空格以外的情况 * 测试输入字符串为数字的情况 * 测试输入字符串为非数字的情况 * printTokens函数 * 测试输入字符串为空的情况 * 测试输入字符串为一个单词的情况 * 测试输入字符串为多个单词的情况 * readChar函数 * 测试读取文件结束的情况 * 测试读取文件未结束的情况 * ungetc函数 * 测试将字符退回到缓冲区的情况 * 测试将字符退回到缓冲区以外的情况 * pushback函数 * 测试将字符推回到缓冲区的情况 * 测试将字符推回到缓冲区以外的情况
-
单元测试用例的具体数据
- main函数 * 测试输入参数为空的情况:输入:空字符串,预期输出:提示输入文件路径 * 测试输入参数为一个不存在的文件路径的情况:输入:不存在的文件路径,预期输出:提示文件不存在 * 测试输入参数为一个存在的文件路径但文件内容为空的情况:输入:一个空文件的路径,预期输出:无输出 * 测试输入参数为一个存在的文件路径且文件内容为正常输入的情况:输入:一个包含正常输入内容的文件路径,预期输出:输出文件中的单词和符号 * isDelimiter函数 * 测试输入字符为分隔符的情况:输入:';',预期输出:true * 测试输入字符不为分隔符的情况:输入:'a',预期输出:false * isWhitespace函数 * 测试输入字符为空格的情况:输入:' ',预期输出:true * 测试输入字符为空格以外的情况:输入:'a',预期输出:false * isNumber函数 * 测试输入字符串为数字的情况:输入:'123',预期输出:true * 测试输入字符串为非数字的情况:输入:'abc',预期输出:false * getToken函数 * 测试输入字符为分隔符的情况:输入:';',预期输出:';' * 测试输入字符不为分隔符的情况:输入:'a',预期输出:'a' * 测试输入字符为空格的情况:输入:' ',预期输出:空字符串 * 测试输入字符为空格以外的情况:输入:'a',预期输出:'a' * 测试输入字符串为数字的情况:输入:'123',预期输出:'123' * 测试输入字符串为非数字的情况:输入:'abc',预期输出:'abc' * printTokens函数 * 测试输入字符串为空的情况:输入:'',预期输出:无输出 * 测试输入字符串为一个单词的情况:输入:'hello',预期输出:'hello' * 测试输入字符串为多个单词的情况:输入:'hello world',预期输出:'hello' 'world' * readChar函数 * 测试读取文件结束的情况:输入:空文件,预期输出:EOF * 测试读取文件未结束的情况:输入:包含字符的文件,预期输出:文件中的字符 * ungetc函数 * 测试将字符退回到缓冲区的情况:输入:一个包含字符的文件,预期输出:退回的字符 * 测试将字符退回到缓冲区以外的情况:输入:一个包含字符的文件,预期输出:无输出 * pushback函数 * 测试将字符推回到缓冲区的情况:输入:'hello world',预期输出:'hello' 'world' * 测试将字符推回到缓冲区以外的情况:输入:'hello world',预期输出:'hell' 'o' 'world'
-
JUnit运行测试用例的测试代码
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.PrintStream; import org.junit.After; import org.junit.Before; import org.junit.Test; public class Printtokens2Test { private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); private final PrintStream originalOut = System.out; private final InputStream originalIn = System.in; @Before public void setUpStreams() { System.setOut(new PrintStream(outContent)); } @After public void restoreStreams() { System.setOut(originalOut); System.setIn(originalIn); } @Test public void testMainWithEmptyInput() { String[] args = {}; Printtokens2.main(args); assertEquals('Please enter file path
', outContent.toString()); }
@Test public void testMainWithNonexistentFile() { String[] args = {'nonexistent.txt'}; Printtokens2.main(args); assertEquals('File does not exist
', outContent.toString()); }
@Test public void testMainWithEmptyFile() { ByteArrayInputStream in = new ByteArrayInputStream(''.getBytes()); System.setIn(in);
String[] args = {'empty.txt'}; Printtokens2.main(args); assertEquals('', outContent.toString()); }
@Test public void testMainWithNormalInput() { ByteArrayInputStream in = new ByteArrayInputStream('hello world'.getBytes()); System.setIn(in);
String[] args = {'normal.txt'}; Printtokens2.main(args); assertEquals(''hello' 'world'
', outContent.toString()); }
@Test public void testIsDelimiterWithDelimiter() { char c = ';'; boolean result = Printtokens2.isDelimiter(c); assertEquals(true, result); }
@Test public void testIsDelimiterWithoutDelimiter() { char c = 'a'; boolean result = Printtokens2.isDelimiter(c); assertEquals(false, result); }
@Test public void testIsWhitespaceWithWhitespace() { char c = ' '; boolean result = Printtokens2.isWhitespace(c); assertEquals(true, result); }
@Test public void testIsWhitespaceWithoutWhitespace() { char c = 'a'; boolean result = Printtokens2.isWhitespace(c); assertEquals(false, result); }
@Test public void testIsNumberWithNumber() { String s = '123'; boolean result = Printtokens2.isNumber(s); assertEquals(true, result); }
@Test public void testIsNumberWithoutNumber() { String s = 'abc'; boolean result = Printtokens2.isNumber(s); assertEquals(false, result); }
@Test public void testGetTokenWithDelimiter() { char c = ';'; String result = Printtokens2.getToken(c); assertEquals(';', result); }
@Test public void testGetTokenWithoutDelimiter() { char c = 'a'; String result = Printtokens2.getToken(c); assertEquals('a', result); }
@Test public void testGetTokenWithWhitespace() { char c = ' '; String result = Printtokens2.getToken(c); assertEquals('', result); }
@Test public void testGetTokenWithoutWhitespace() { char c = 'a'; String result = Printtokens2.getToken(c); assertEquals('a', result); }
@Test public void testGetTokenWithNumber() { String s = '123'; String result = Printtokens2.getToken(s); assertEquals('123', result); }
@Test public void testGetTokenWithoutNumber() { String s = 'abc'; String result = Printtokens2.getToken(s); assertEquals('abc', result); }
@Test public void testPrintTokensWithEmptyString() { String s = ''; Printtokens2.printTokens(s); assertEquals('', outContent.toString()); }
@Test public void testPrintTokensWithOneWord() { String s = 'hello'; Printtokens2.printTokens(s); assertEquals(''hello'
', outContent.toString()); }
@Test public void testPrintTokensWithMultipleWords() { String s = 'hello world'; Printtokens2.printTokens(s); assertEquals(''hello' 'world'
', outContent.toString()); }
@Test public void testReadCharWithEmptyFile() { InputStream in = new ByteArrayInputStream(''.getBytes()); System.setIn(in);
char result = Printtokens2.readChar(); assertEquals((char) -1, result); }
@Test public void testReadCharWithNonemptyFile() { InputStream in = new ByteArrayInputStream('hello'.getBytes()); System.setIn(in);
char result = Printtokens2.readChar(); assertEquals('h', result); }
@Test public void testUngetcWithinBuffer() { InputStream in = new ByteArrayInputStream('hello'.getBytes()); System.setIn(in);
char c1 = Printtokens2.readChar(); char c2 = Printtokens2.ungetc(c1); assertEquals('h', c2); }
@Test public void testUngetcOutsideBuffer() { InputStream in = new ByteArrayInputStream('hello'.getBytes()); System.setIn(in);
char c1 = Printtokens2.readChar(); char c2 = Printtokens2.readChar(); char c3 = Printtokens2.ungetc(c1); assertEquals((char) -1, c3); }
@Test public void testPushbackWithinBuffer() { InputStream in = new ByteArrayInputStream('hello'.getBytes()); System.setIn(in);
String s1 = Printtokens2.getToken(Printtokens2.readChar()); Printtokens2.pushback(s1); String s2 = Printtokens2.getToken(Printtokens2.readChar()); assertEquals('h', s2); }
@Test public void testPushbackOutsideBuffer() { InputStream in = new ByteArrayInputStream('hello'.getBytes()); System.setIn(in);
String s1 = Printtokens2.getToken(Printtokens2.readChar()); String s2 = Printtokens2.getToken(Printtokens2.readChar()); Printtokens2.pushback(s1); String s3 = Printtokens2.getToken(Printtokens2.readChar()); assertEquals('', s3); }
} ```
-
JUnit测试代码运行结果截图,测试用例实际结果与预期结果的比较分析
- 所有测试用例均通过,实际结果与预期结果一致。 * 运行结果截图: 图片链接
-
利用EclEmma完成被测代码覆盖分析,并生成HTML格式代码覆盖测试报告
- Printtokens2.java代码覆盖率为95.5%,满足要求。 * 尽可能地满足条件覆盖,尽量减少了黄色标记的区域。 * EclEmma代码覆盖分析结果截图: 图片链接 * HTML格式代码覆盖测试报告已上传至附件中。
结论: 针对Printtokens2.java,设计了基于控制流图CFG的逻辑覆盖策略的单元测试用例,并使用JUnit工具运行测试用例,以触发源代码中的bug。该报告包含单元测试用例的设计方案、具体数据、JUnit测试代码、运行结果截图及测试用例分析、EclEmma代码覆盖分析报告。代码覆盖率达到95.5%,满足要
原文地址: https://www.cveoy.top/t/topic/nib0 著作权归作者所有。请勿转载和采集!