高效 JavaScript 单元测试

2023-11-02

一个损坏的 JavaScript 代码示例

        Web 应用程序面临的一个最大挑战是支持不同版本的 Web 浏览器。能在 Safari 上运行的 JavaScript 代码不一定能在 Windows® Internet Explorer (IE)、Firefox 或 Google Chrome 上运行。这个挑战的根源是呈现层中的 JavaScript 代码从一开始就没有进行测试。如果没有对代码进行单元测试,那么在升级或支持新浏览器后,组织可能需要花钱反复测试 Web 应用程序。本文将展示如何通过高效的 JavaScript 代码单元测试降低测试成本。

        一个常见用例是登录表单 JavaScript 验证。考虑清单 1 中的表单。

        清单 1. 登录表单

01 <FORM>
02     <table>
03         <tr>
04             <td>Username</td>
05             <td><input type="text" id="username"/></td>
06             <td><span id="usernameMessage"></span></td>
07         </tr>
08         <tr>
09             <td>Password</td>
10             <td><input type="password" id="password"/></td>
11             <td><span id="passwordMessage"></span></td>
12         </tr>   
13         <tr>
14             <td><input type="button" onclick="new appnamespace.
15             ApplicationUtil () .validateLoginForm ()" value="Submit"/></td>
16         </tr>
17     </table>
18 </FORM>

        这个表单很简单,仅包含用户名和密码字段。单击提交按钮时,将通过 ApplicationUtil 执行一个特定的表单验证。以下是负责验证 HTML 表单的 JavaScript 对象。清单 2 显示了 ApplicationUtil 对象的代码。

        清单 2. 损坏的 ApplicationUtil 对象代码

01 appnamespace = {};
02  
03 appnamespace.ApplicationUtil = function() {};
04  
05 appnamespace.ApplicationUtil.prototype.validateLoginForm =  function(){
06     var error = true;
07     document.getElementById ("usernameMessage") .innerText = "";
08     document.getElementById ("passwordMessage") .innerText = "";   
09  
10     if (!document.getElementById ("username") .value) {
11         document.getElementById ("usernameMessage") .innerText =
12         "This field is required";
13         error = false;
14     }
15      
16     if (!document.getElementById ("password") .value) {
17         document.getElementById ("passwordMessage") .innerText =
18         "This field is required";
19         error = false;
20     }       
21  
22     return error;       
23 };

        在清单 2 中,ApplicationUtil 对象提供一个简单验证:用户名和密码字段都已填充。如果某个字段为空,就会显示一条错误消息:This field is required

        上面的代码能够在 Internet Explorer 8 和 Safari 5.1 上工作,但无法在 Firefox 3.6 上工作,原因是 Firefox 不支持innerText 属性。通常,(上述代码和其他类似 JavaScript 代码中的)主要问题是不容易发现编写的 JavaScript 代码是不是跨浏览器兼容的。

        这个问题的一个解决方案是进行自动化单元测试,检查代码是不是跨浏览器兼容。

        JsTestDriver

        JsTestDriver library 是最好的 JavaScript 单元测试框架之一,它为 JavaScript 代码提供了跨浏览器测试。图 1 展示了 JsTestDriver 的架构。

        图 1. JsTestDriver 架构

高效 JavaScript 单元测试

        捕获不同的浏览器之后,服务器会负责将 JavaScript 测试用例运行程序代码加载到浏览器中。可以通过命令行捕获浏览器,也可以通过将浏览器指向服务器 URL 来捕获浏览器。一旦捕获到浏览器,该浏览器就被称为从属浏览器。服务器可以加载 JavaScript 代码,在每个浏览器上执行测试用例,然后将结果返回给客户端。

        客户端(命令行)需要以下两个主要项目:

  1. JavaScript 文件,即源文件和测试文件
  2. 配置文件,用于组织源文件和测试文件的加载

        这个架构比较灵活,允许单个服务器从网络中的其他机器捕获任意数量的浏览器。例如,如果您的代码在 Linux 上运行但您想针对另一个 Windows 机器上的 Microsoft Internet Explorer 运行您的测试用例,那么这个架构很有用。

        要使用 JsTestDriver 库,请先下载最新版的 JsTestDriver 1.3.2

jsTestDriver 是开源项目

jsTestDriver 是 Apache 2.0 许可 下的一个开源项目,托管在 Google Code 上,后者是一个类似于 SourceForge 的项目存储库。只要使用 Open Source Initiative 批准的 许可,开发人员就能在这个存储库中创建和管理公共项目。

还有许多其他 JavaScript 单元测试工具,请参见下面的 参考资料 部分中的其他工具,比如 Dojo Objective Harness (DOH)。

        编写单元测试代码

        现在开始编写 JavaScript 测试用例。为简单起见,我将测试以下用例:

  • 用户名和密码字段均为空。
  • 用户名为空,密码不为空。
  • 用户名不为空,密码为空。

        清单 3 显示了表示 TestCase 对象的 ApplicationUtilTest 对象的部分代码。

        清单 3. ApplicationUtilTest 对象代码的一部分

01 <strong>ApplicationUtilTest = TestCase ("ApplicationUtilTest");
02  
03 ApplicationUtilTest.prototype.setUp = function () {
04 /*:DOC += <FORM action=""><table><tr><td>Username</td><td>
05 <input type="text" id="username"/></td><td><span id="usernameMessage">
06 </span></td></tr><tr><td>Password</td><td>
07 <input type="password" id="password"/></td><td><span id="passwordMessage"
08 ></span></td></tr></table></FORM>*/
09 };
10  
11 ApplicationUtilTest.prototype.testValidateLoginFormBothEmpty = function () {
12     var applicationUtil = new appnamespace.ApplicationUtil ();
13      
14     /* Simulate empty user name and password */
15     document.getElementById ("username") .value = "";
16     document.getElementById ("password") .value = "";   
17     applicationUtil.validateLoginForm ();
18     assertEquals ("Username is not validated correctly!""This field is required",
19     document.getElementById ("usernameMessage") .innerHTML);
20     assertEquals ("Password is not validated correctly!""This field is required",
21     document.getElementById ("passwordMessage") .innerHTML);   
22 };</strong>

        ApplicationUtilTest 对象通过 JsTestDriver TestCase 对象创建。如果您熟悉 JUnit 框架,那么您肯定熟悉setUp 和 testXXX 方法。setUp 方法用于初始化测试用例。对于本例,我使用该方法来声明一个 HTML 片段,该片段将用于其他测试用例方法。

        DOC 注释是一个 JsTestDriver 惯用语,可以用于轻松声明一个 HTML 片段。

        在 testValidateLoginFormBothEmpty 方法中,创建了一个 ApplicationUtil 对象,并在测试用例方法中使用该对象。然后,代码通过检索用户名和密码的 DOM 元素并将它们的值设置为空值来模拟输入空用户名和密码。可以调用validateLoginForm 方法来执行实际表单验证。最后,将调用 assertEquals 来确保 usernameMessage 和 passwordMessagespan 元素中的消息是正确的,即:This field is required

        在 JsTestDriver 中,可以使用以下构件:

  • fail ("msg"):表明测试一定会失败,消息参数将显示为一条错误消息。
  • assertTrue ("msg", actual):断定实际参数正确。否则,消息参数将显示为一条错误消息。
  • assertFalse ("msg", actual):断定实际参数错误。否则,消息参数将显示为一条错误消息。
  • assertSame ("msg", expected, actual):断定实际参数与预期参数相同。否则,消息参数将显示为一条错误消息。
  • assertNotSame ("msg", expected, actual):断定实际参数与预期参数不相同。否则,消息参数将显示为一条错误消息。
  • assertNull ("msg", actual):断定参数为空。否则,消息参数将显示为一条错误消息。
  • assertNotNull ("msg", actual):断定实际参数不为空。否则,消息参数将显示为一条错误消息。

        其他方法的代码包含其他测试用例。清单 4 显示了测试用例对象的完整代码。

        清单 4. ApplicationUtil 对象完整代码

01 ApplicationUtilTest = TestCase ("ApplicationUtilTest");
02  
03 ApplicationUtilTest.prototype.setUp = function () {
04 /*:DOC += <FORM action=""><table><tr><td>Username</td><td>
05 <input type="text" id="username"/></td><td><span id="usernameMessage">
06 </span></td></tr><tr><td>Password</td><td>
07 <input type="password" id="password"/></td><td><span id="passwordMessage"
08 ></span></td></tr></table></FORM>*/
09 };
10  
11 ApplicationUtilTest.prototype.testValidateLoginFormBothEmpty = function () {
12     var applicationUtil = new appnamespace.ApplicationUtil ();
13      
14     /* Simulate empty user name and password */
15     document.getElementById ("username") .value = "";
16     document.getElementById ("password") .value = "";   
17      
18     applicationUtil.validateLoginForm ();
19      
20     assertEquals ("Username is not validated correctly!""This field is required",
21     document.getElementById ("usernameMessage") .innerHTML);
22     assertEquals ("Password is not validated correctly!""This field is required",
23     document.getElementById ("passwordMessage") .innerHTML);   
24 };
25  
26 ApplicationUtilTest.prototype.testValidateLoginFormWithEmptyUserName = function () {
27     var applicationUtil = new appnamespace.ApplicationUtil ();
28      
29     /* Simulate empty user name and password */
30     document.getElementById ("username") .value = "";
31     document.getElementById ("password") .value = "anyPassword";   
32      
33     applicationUtil.validateLoginForm ();
34      
35     assertEquals ("Username is not validated correctly!",
36     "This field is required", document.getElementById ("usernameMessage") .innerHTML);
37     assertEquals ("Password is not validated correctly!",
38     "", document.getElementById ("passwordMessage") .innerHTML);   
39 };
40  
41 ApplicationUtilTest.prototype.testValidateLoginFormWithEmptyPassword = function () {
42     var applicationUtil = new appnamespace.ApplicationUtil ();
43      
44     document.getElementById ("username") .value = "anyUserName";
45     document.getElementById ("password") .value = "";   
46      
47     applicationUtil.validateLoginForm ();
48      
49     assertEquals ("Username is not validated correctly!",
50     "", document.getElementById ("usernameMessage") .innerHTML);
51     assertEquals ("Password is not validated correctly!",
52     "This field is required", document.getElementById ("passwordMessage").
53     innerHTML);   
54 };

        配置用于测试的不同浏览器

        测试 JavaScript 代码的一个推荐实践是将 JavaScript 源代码和测试代码放置在不同的文件夹中。对于图 2 中的示例,我将 JavaScript 源文件夹命名为 "js-src",将 JavaScript 测试文件夹命名为 "js-test",它们都位于 "js" 父文件夹下。

        图 2. JavaScript 测试文件夹结构

高效 JavaScript 单元测试

        组织好源和测试文件夹后,必须提供配置文件。默认情况下,JsTestDriver 运行程序会寻找名为 jsTestDriver.conf 的配置文件。您可以从命令行更改配置文件名称。清单 5 显示了 JsTestDriver 配置文件的内容。

        清单 5. JsTestDriver 配置文件内容

server: http://localhost:9876  load:
  - js-src/*.js
  - js-test/*.js

        配置文件采用 YAML 格式。server 指令指定测试服务器的地址,load 指令指出了将哪些 JavaScript 文件加载到浏览器中以及加载它们的顺序。

        现在,我们将在 IE、Firefox 和 Safari 浏览器上运行测试用例类。

        要运行测试用例类,需要启动服务器。您可以使用以下命令行启动 JsTestDriver 服务器:

java -jar JsTestDriver-1.3.2.jar --port 9876 --browser "[Firefox Path]",
          "[IE Path]","[Safari Path]"

        使用这个命令行,服务器将以 Port 9876 启动,捕获您的机器上的 Firefox、IE 和 Safari 浏览器。

        启动并捕获浏览器后,可以通过以下命令行运行测试用例类:

java -jar JsTestDriver-1.3.2.jar --tests all

        运行命令后,您将看到第一轮结果,如清单 6 所示。

        清单 6. 第一轮结果

Total 9 tests (Passed: 6; Fails: 3; Errors: 0) (16.00 ms)
  Firefox 3.6.18 Windows: Run 3 tests (Passed: 0; Fails: 3; Errors 0) (8.00 ms)
    ApplicationUtilTest.testValidateLoginFormBothEmpty failed (3.00 ms): 
    AssertError: Username is not validated correctly! expected "This field 
    is required" but was "" Error ("Username is not validated correctly! 
    expected \"This field is required\" but was \"\"")@:0()@http://localhost     :9876/test/js-test/TestApplicationUtil.js:16

    ApplicationUtilTest.testValidateLoginFormWithEmptyUserName failed (3.00 ms): 
    AssertError: Username is not validated correctly! expected "This field is 
    required" but was "" Error ("Username is not validated correctly! expected 
    \"This field is required\" but was \"\"")@:0()@http://localhost:9876/test     /js-test/TestApplicationUtil.js:29

    ApplicationUtilTest.testValidateLoginFormWithEmptyPassword failed (2.00 ms): 
    AssertError: Password is not validated correctly! expected "This field is 
    required" but was "" Error ("Password is not validated correctly! expected 
    \"This field is required\" but was \"\"")@:0()@http://localhost:9876/test/     js-test/TestApplicationUtil.js:42
    
  Safari 534.50 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (2.00 ms)
  Microsoft Internet Explorer 8.0 Windows: Run 3 tests (Passed: 3; Fails: 0; 
  Errors 0) (16.00 ms)
Tests failed: Tests failed. See log for details.

        注意,在清单 6 中,主要问题出在 Firefox 上。测试在 Internet Explorer 和 Safari 上均可顺利运行。 

        修复 JavaScript 代码并重新运行测试用例

        我们来修复损坏的 JavaScript 代码。我们将使用 innerHTML 替代 innerText。清单 7 显示了修复后的ApplicationUtil 对象代码。

        清单 7. 修复后的 ApplicationUtil 对象代码

appnamespace = {};

appnamespace.ApplicationUtil = function() {};

appnamespace.ApplicationUtil.prototype.validateLoginForm =  function(){
    var error = true;
    document.getElementById ("usernameMessage") .innerHTML = "";
    document.getElementById ("passwordMessage") .innerHTML = "";    

    if (!document.getElementById ("username") .value) {
        document.getElementById ("usernameMessage") .innerHTML = 
        "This field is required";
        error = false;
    }
    
    if (!document.getElementById ("password") .value) {
        document.getElementById ("passwordMessage") .innerHTML = 
        "This field is required";
        error = false;
    }        

    return error;        
};

        使用 --test all 命令行参数重新运行测试用例对象。清单 8 显示了第二轮运行结果。

        清单 8. 第二轮运行结果

Total 9 tests (Passed: 9; Fails: 0; Errors: 0) (9.00 ms)
  Firefox 3.6.18 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (9.00 ms)
  Safari 534.50 Windows: Run 3 tests (Passed: 3; Fails: 0; Errors 0) (5.00 ms)
  Microsoft Internet Explorer 8.0 Windows: Run 3 tests (Passed: 3; Fails: 0; 
Errors 0) 
  (0.00 ms)

        如清单 8 所示,JavaScript 代码现在在 IE、Firefox 和 Safari 上都能正常运行。

        结束语

        在本文中,您了解了如何使用一个最强大的 JavaScript 单元测试工具 (JsTestDriver) 在不同的浏览器上测试 JavaScript 应用程序代码。还了解了什么是 JsTestDriver,如何配置它,以及如何在 Web 应用程序中使用它来确保应用程序的 JavaScript 代码的质量和可靠性。

        下载

描述 名字 大小 下载方法
源代码 simple.zip 3. 35MB HTTP

        关于下载方法的信息

        参考资料

        学习

  • 访问 JUnit.org,了解如何使用 JUnit 测试框架。
  • 详细了解 YAML,这是一个针对所有编程语言的人类友好的数据序列化标准。
  • 访问 developerWorks Open source 专区获得丰富的 how-to 信息、工具和项目更新以及最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。

        获得产品和技术

        讨论

        关于作者

        Hazem Saleh 有 6 年的 JEE 和开源技术经验。他致力于 Apache MyFaces 方面的工作,是 MyFaces 项目许多组件的发起人,比如 Tomahawk CAPTCHA、Commons ExportActionListener、Media、PasswordStrength 等等。他是 GMaps4JSF(一个集成 Google Maps 和 Java ServerFaces 的集成项目)和 Mashups4JSF(集成 mashup 服务和 JavaServer Faces 的集成项目)的创始人,是《The Definitive Guide to Apache MyFaces and Facelets (Apress)》和其他许多 JSF 文章的作者,并且是 developerworks 的投稿人和 JSF 演讲家。他现在是 IBM Egypt 的资深软件工程师和 Web 2.0 技术的主题专家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效 JavaScript 单元测试 的相关文章

  • 如何使用 HTML 5 实现类似 gmail 的文件上传/附件

    我记得一些支持 Ajax 之类的选项 无回发世界 文件上传 隐藏的 iframe 使用 flash 对象 尽管我仍然好奇为什么使用 SWF 以及它提供什么优势 然而 通过查看博客 HTML 5 似乎很有前途 我尝试了一些小示例 它确实有效
  • axios 请求中未发送正文数据

    我试图通过 axios 请求将数据发送到我的后端脚本 但正文看起来是空的 这是前端发送的请求 axios request method GET url http localhost 4444 next api headers Authori
  • MailTo 从 Javascript

    我有一个链接按钮 用于从页面内容构建邮件 从 javascript 启动它而不打开空白窗口或干扰调用它的窗口的最佳方法是什么 function Email var sMailTo mailto var sBody var alSelecte
  • Angular UI select:从远程服务获取数据

    我正在使用角度用户界面选择 https github com angular ui ui select https github com angular ui ui select 我查看了演示的可用位置这个笨蛋 http plnkr co
  • 如果没有“new”,则无法调用类构造函数

    感谢这个问题已经被问过几次了 但是我遇到的几乎所有情况都是有人试图扩展非本地类的情况 我的情况有所不同 我有一个非常简单的基类 名为CObject如下 export class CObject extends BaseObject cons
  • 使用 Firefox 插件 sdk 的 nsISocketTransportService

    我正在尝试使用 Firefox 来读取 SSH 横幅 IE 当您最初连接到 SSH 服务器时 服务器会向您发送其横幅 标识服务器软件 并且您向 SSH 服务器发送您的横幅 标识您的客户端软件 为此 我使用以下 URL 中的示例 firefo
  • JQuery datepickers-从开始日期设置结束日期

    使用了两个 Jquery 日期选择器 StartDate 和 EndDate
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • React JS 服务器端问题 - 找不到窗口

    你好 我正在尝试在我的reactJS项目中使用react rte 我有服务器端渲染 每次我想使用这个包时 我都会得到 return msie 6 9 b test window navigator userAgent toLowerCase
  • 如何在 select 和 option 标签中添加 JSON 数据?

    我有这个html代码 div class searchfilter div class searchwrapper div div
  • 如何在 React Native 上显示 SVG 文件?

    我想显示 svg 文件 我有一堆 svg 图像 但我找不到显示的方式 我尝试使用Image and Use的组成部分反应本机 svg https github com magicismight react native svg但他们不这样做
  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • 如何在 Web 服务器上设置 gzip 压缩?

    我有一个嵌入式网络服务器 总共有 2 兆空间 通常 您使用 gzip 文件对客户端有利 但这会节省我们在服务器上的空间 我读到你可以只 gzip js 文件并将其保存在服务器上 我在 IIS 上测试过 但没有任何运气 为了使这项工作成功 我
  • 使用 JQuery 禁用和启用所有超链接

    我有以下禁用所有超链接的内容 但在事件发生后我想再次启用它们 我该如何执行此操作 a click function return false 我认为这不仅仅是将其设置为 true 那么简单 谢谢大家 不要以这种方式绑定 点击 处理程序 而是
  • 如果一个对象结构与另一个对象结构不匹配/不匹配,如何引发异常

    我将读取格式正确的用户输入对象 也就是说 输入对象现在可以具有接口中未定义的任何键或子结构 如果用户提供了无效的对象 我如何抛出异常 预定义接口 export interface InputStructureInterface tableN
  • 为什么 Node.js 应用程序只能从 127.0.0.1/localhost 访问?

    我本来打算教我的朋友介绍 Node 但是后来 我想知道为什么这个代码来自nodejs org var http require http http createServer function req res res writeHead 20
  • d3.event.translate 在触摸设备的缩放上包含 NaN

    我使用 d3 为我的 svg 编写了一个自定义缩放函数 如下所示 Zoom behavior function myzoom xpos d3 event translate 0 ypos d3 event translate 1 vis a
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒
  • 如何在运行脚本之前提交活动单元格中所做的更改? (Google 表格/Google Apps 脚本)

    我正在使用 Google Apps 脚本在 Google 表格中创建提交表单 该表单位于一页上 提交内容被移至第二个隐藏页面 当用户填写表单后 他们按下提交页面上的按钮以激活脚本 我遇到的问题是 当用户填写最后一个单元格然后单击按钮时 输入

随机推荐

  • FILE结构体与fd文件标识符

    FILE结构体 我们通常对文件进行操作时 都会使用一些与文件相关的函数 比如 打开文件 FILE fopen const char path const char mode 关闭文件 int fclose FILEE fp 读文件 size
  • Java实战03之idea pringboot 整合log4j2日志,可以多日志文件

    目录 前言 一 先添加pom xml 依赖 二 log4j2 xml 配置 三 application yml 四 加几条测试日志 五 采用注解 log4j2 1 log4j2 xml 配置 2 测试类 编辑 启动项目 编辑 六 打印多个不
  • Python并发编程——多线程thread,多进程process,多协程coroutine的区别与选择

    目录 1 IO Bound与CPU Bound 2 多进程 多线程 多协程的对比 3 如何进行选择 1 IO Bound与CPU Bound IO Bound IO Bound指的是程序的运行效率受计算机IO能力的限制 在程序的运行过程中
  • Java 进程

    目录 什么是进程 操作系统 进程控制块 PCB PCB中的一些属性 pid 进程id 内存指针 文件描述符表 状态 优先级 记账信息 上下文 并行 并发 CPU分配 进程调度 内存分配 内存管理 进程间是如何通信的 什么是进程 如图 当我们
  • Flink CDC 2.2 正式发布,新增功能概述

    一 Flink CDC 2 2 概览经过3个多月的紧张开发 在社区开发者们的共同努力下 Flink CDC 2 2 版本正式发布了 Release Release 2 2 0 ververica flink cdc connectors G
  • Design Compiler —— Design Compliler中常用到的命令(示例)总结(十三)

    转载文章 来源出处 http www cnblogs com IClearner 作者 IC learner 本文将描述在Design Compliler中常用到的命令 这些命令按照流程的顺序进行嵌套讲解 主要是列举例子 大概的讲解布局如下
  • 基于树莓派的空气监测系统(1)项目介绍

    基于树莓派的空气监测系统 1 项目介绍 项目开发使用的知识点包括 Qt程序设计 Python编程 文件编程 串口编程 树莓派驱动程序开发 嵌入式系统学习 视频地址 嵌入式学习资料 资料地址 项目参考代码 下载 编译运行环境x86平台 程序中
  • close函数 qt_Qt学习: QCloseEvent关闭事件的使用及代码示例

    QCloseEvent事件是指 当你鼠标点击窗口右上角的关闭按钮时 所触发的函数 如果你没有重写virtual closeEvent QCloseEvent event 这个虚函数的话 系统是默认接受关闭事件的 所以就会关闭窗体 但有的时候
  • 基于51单片机的教室智能照明控制设计

    具体实现功能 系统由STC89C52单片机 时钟芯片DS1302 液晶屏LCD1602 光敏电阻 红外对管 LED灯模块 按键模块构成 具体功能 1 用4个LED灯模拟教室的照明灯 人数小于10人亮一个灯 10 20人亮二个灯 20 30人
  • cp文件服务器,docker容器与物理机的文件传输—docker cp命令

    ocker cp 用于容器与主机之间的数据拷贝 语法 docker cp OPTIONS CONTAINER SRC PATH DEST PATH docker cp OPTIONS SRC PATH CONTAINER DEST PATH
  • RK平台images打包细则

    IMGs打包细节 平台 RK3288 背景 RK3288编译产生了RK3288MiniLoaderAll V2 19 bin uboot img kernel img uboot img misc img recovery img reso
  • pycharm终端激活环境时报错

    pycharm终端激活环境时报错 nvoke Expression 无法将参数绑定到参数 Command 因为该参数为空字符串 所在位置 E anaconda anaconda anaconda3 envs wsbpytorch shell
  • 启明智显分享

    你现在所看到的是启明智显基于乐鑫ESP32 S3方案推出的4寸RGB接口的86盒开发板 你可以选择应用IDF或arduino进行开发 也可以选择我们提供的开发工具平台8ms上进行开发 为什么会选择8ms平台呢 因为平台已将LVGL作为可选软
  • Java使用FTP上传文件被损坏的问题

    原因 首先 此问题是因为FTP协议定义的数据传输方式有关 当Java FTP客户端使用ASCII传输时会发现有些上传的文件已经被损坏 FTP协议规定了两种传输方式分别是ASCII与binary方式 ASCII 方式 这种机制指 在针对传输内
  • eclipse中开发corba完整说明(jacORB版)

    以下是java eclipse平台上配置并使用jacORB2 3 0开发例子的步骤 0 安装jdk1 6 0 要求 jdk的安装路径里不能包含 空格字符或中文等一些jvm无法识别的字符 配置环境变量JAVA HOME D JavaTool
  • 陆奇如何解构一家企业?

    以下内容来自微信公众号 湖畔大学 ID hupansanbanfu 陆奇博士是整个华人圈中在科技公司做到最高管理职位 视野最宽广的人 也是我最尊重和最认可的科技公司管理者 未来所有企业都要转型成为科技企业 战略 布局和视野将决定每个企业的屋
  • dyld[19592]: Library not loaded: @rpath/SDWebImage.framework/SDWebImage

    SDK开发长见错 Demo中已引入SDWebImage framework 编译也不报错 运行demo的时候直接闪退 报 dyld 19592 Library not loaded rpath SDWebImage framework SD
  • google app engine(webapp2)文件下载

    enroll file enroll mobileconfig filecontent open conf enroll file rb read self response headers add header Content Type
  • Android 安装程序(APK)后并启动程序(APK) 安装 卸载

    Android 安装程序 APK 后并启动程序 APK Intent i new Intent Intent ACTION VIEW i setDataAndType Uri parse file apkfile application v
  • 高效 JavaScript 单元测试

    一个损坏的 JavaScript 代码示例 Web 应用程序面临的一个最大挑战是支持不同版本的 Web 浏览器 能在 Safari 上运行的 JavaScript 代码不一定能在 Windows Internet Explorer IE F