【问题标题】:how can I unit test an output of HTML code如何对 HTML 代码的输出进行单元测试
【发布时间】:2019-05-08 13:45:18
【问题描述】:

我对 Web 开发和测试非常陌生(起步缓慢)。我有一个带有按钮的页面。单击按钮后,将显示一些信息/文本。

我如何编写测试用例来测试输出是否符合预期(显示)?

我想写一个测试用例,确保点击按钮时文本显示出来。

<!DOCTYPE html>
<html>
 <body>

 <button onclick="buttonClick()">Click Me</button>
 <p id="test"></p>

  <script>
    function buttonClick() {
      document.getElementById("test").innerHTML = "TESTING!";
}
  </script>

 </body>
</html>

我的猜测是我可以使用某种字符串验证器。如果屏幕上出现字符串,则表示测试通过。我不确定这是否有意义,或者它是否是正确的方法。

谢谢,

测试代码:

var elem = document.getElementById('test');
var text = 'TESTING!';

if (
   document.getElementById('test').innerHTML.indexOf('TESTING') != -1){
     alert('success!');
}

【问题讨论】:

    标签: javascript html reactjs unit-testing jestjs


    【解决方案1】:

    您可以测试字符串是否被渲染,但单元测试应该测试数据,而不是标记。后者的问题相当罕见,并且在部署和手动测试代码时更为明显。 (你不会推广那些没有明显呈现带有 something 的按钮的更改。)

    相反,将值分配给一个变量并测试该变量在您的函数中是否正确。

    function buttonClick();
        let myButtonText = 'TESTING!';
        document.getElementById("test").innerHTML = myButtonText;
    }
    
    // in the test, assert that myButtonText should equal your string,
    // which demonstrates that the function works or has been called
    

    如果将字符串传递到调用函数的函数中,这个测试可能更有价值:

    function buttonClick(str);
        document.getElementById("test").innerHTML = str;
    }
    
    // assert that str is defined when inside the function
    

    如果您需要测试输出,您可以根据元素 ID 查看按钮的字符串值(nodeValuetextContent),或在文档中查找整个标记字符串。这两种方法都满足您的要求,但很脆弱(取决于特定的标记和字符串值)。

    检查整个文档的标记 sn-p 可能如下所示:

     document.documentElement.innerHTML.indexOf('<button>string</button>')
    

    Read more on that

    当然,如果任何脚本或库添加了类或其他属性,这将失败。

    【讨论】:

    • 嗨,伊舍伍德。不幸的是,我正在从事一个需要一种测试输出的方法(不适用于学校/工作)的项目。我将把它提交给 git,然后使用 jenkins 来构建/测试。它不一定是单元测试。任何类型的测试都可以测试单击按钮后是否显示输出文本。
    • 嗨,isherwood,我有点问题。我在 react 框架中做,并将它作为我的 index.test.js(使用 Jest 来测试它)。有任何想法吗?请参阅上面的代码进行测试。
    【解决方案2】:

    您所描述的测试是端到端测试,从用户输入到用户输出,涉及复杂的组件,例如浏览器。这样的测试绝对不是单元测试——它将是子系统甚至系统测试。

    对于 Web 应用程序自动化测试的具体问题,您可以使用 Selenium (https://en.wikipedia.org/wiki/Selenium_(software)) 之类的框架。这将允许您模拟按钮按下,然后随后分析生成的内容 - 不是呈现形式,而是在 html 页面内容(文本)级别。

    【讨论】:

    • 这是我最初的想法,但仔细想想,这个问题只是描述了一些 JavaScript。没有提到任何后端。如果测试纯粹是断言该 JavaScript 的行为,那么我会说它肯定仍然是一个单元测试。有许多 JavaScript 单元测试框架(例如 Karma)可以做到这一点。
    • 感谢您的评论。但我正在尝试使用 Jest。我有点问题。我在 react 框架中做,并将它作为我的 index.test.js(使用 Jest 来测试它)。有任何想法吗?请参阅上面的代码进行测试。运行“npm test”时,我不断收到错误消息。谢谢..
    • @DaveyDaveDave 我同意没有明确提到后端,也许我对这个问题的解释太多了。但是,OP 两次强调重要的是“显示”文本加上“屏幕上出现字符串”,而不是修改文档以包含正确的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多