常用语言单元测试框架入门

2023-11-16

本文主要介绍Python,java,go,C++,OC常用单元测试框架。用于了解各种语言单测。

一 python单元测试Pytest

1. Pytest主要功能

pytest是python的一种单元测试框架,同自带的Unittest测试框架类似,相比于Unittest框架使用起来更简洁,效率更高。

  1. 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考。
  2. 能够支持简单的单元测试和复杂的功能测试。
  3. 支持参数化。
  4. 能够执行全部测试用例,也可以挑选部分测试用例执行,并能重复执行失败的用例。
  5. 支持并发执行,还能运行由nose, unittest编写的测试用例。
  6. 方便、简单的断言方式。
  7. 能够生成标准的Junit XML格式的测试结果。
  8. 具有很多第三方插件,并且可以自定义扩展。
  9. 方便的和持续集成工具集成。

2. 安装

$ pip install -U pytest

pycharm运行pytest,需要修改该工程设置默认的运行器

3. Demo

import pytest

class Testcase001:
    def setup(self):
        print("setup: 每个用例开始前执行")

    def teardown(self):
        print("teardown: 每个用例结束后执行")

    def test_001(self):
        x = "hello"
        assert "h" in x
    def test_002(self):
        a=10
        assert a < 20

if __name__ == "__main__":
    pytest.main(["-q", "test_d.py"])
3.1 测试用例setup和teardown
  • 模块级(setup_module/teardown_module)开始于模块始末,全局的
  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
  • 方法级(setup_method/teardown_method)开始于方法始末(在类中)
  • 类里面的(setup/teardown)运行在调用方法的前后
3.2 自定义测试用例的预置条件

firture相对于setup和teardown来说应该有以下几点优势

  • 命名方式灵活,不局限于setup和teardown这几个命名
  • conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
  • scope=“module” 可以实现多个.py跨文件共享前置, 每一个.py文件调用一次
  • scope=“session” 以实现多个.py跨文件使用一个session来完成多个用例

调用fixture三种方法

  • 1.函数或类里面方法直接传fixture的函数参数名称
  • 2.使用装饰器@pytest.mark.usefixtures()修饰
  • 3.autouse=True自动使用
#conftest.py
import pytest
@pytest.fixture()
def login():
    print("输入账号,密码先登录")

#conftest配置参数
def pytest_addoption(parser):
    parser.addoption(
        "--cmdopt", action="store", default="type1", help="my option: type1 or type2"
    )

@pytest.fixture
def cmdopt(request):
    return request.config.getoption("--cmdopt")
class Testcase001:
    def test_001(self, login):
        x = "hello"
        assert "h" in x

3.3 测试用例参数化,可以实现测试用例参数化
3.4 命令行传参,需要在conftest.py添加命令行选项
3.5 assert断言
3.6 pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能
3.7 函数传参和fixture传参数request,如登录函数(使用不同账号)

二 java单元测试JUnit4

1. JUnit4主要功能

1.主流Java单元测试框架,注解支持
2.测试分为三级:test,test case,test suite
3.丰富的断言机制,判断测试通过/失败
4.支持不同级别的公共数据准备(Fixture)

2. 插件安装

第一步:在你需要添加Junit的工程下,右键工程
第二步:点击configure Build Path…
第三步:点击Add Library:JUnit4,JUnitGenerator V2.0
JUnitGenerator V2.0: 修改Output Path为:${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME},
Default Template选择JUnit 4。

3. dome

//被测试函数
public class Demo {
    public int add(int a ,int b){
        return a + b ;
    }
}
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

public class DemoTest {
    static Demo d;
    @Before
    public void setUp() throws Exception {
        System.out.println("静态方法");
        d = new Demo();
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("执行完了");
    }

    @Test
    public void add () {
        Assert.assertEquals(10, d.add(4, 6)) ;
        System.out.println("测试中");
    }
    //异常测试
    @Test(expected = ArithmeticException.class)
    public void divisionWithException() {
        int i = 1/0;
    }
    //忽略测试
    @Ignore("Not Ready to Run")
    @Test
    public void divisionWithException1() {
        System.out.println("Method is not ready yet");
    }
    //时间限制
    @Test(timeout = 1000)
    public void infinity() {
        while (true);
    }
}
import org.junit.runner.RunWith;
import org.junit.runners.Suite.SuiteClasses;
import org.junit.runners.Suite;


@RunWith(Suite.class) //声明套件运行器
@SuiteClasses({DemoTest.class}) //将需要一起测试的类放进来
public class SuiteTest {
    /* 
     * 测试套件就是组织测试类一起运行的 
     * 写一个作为测试套件的入口类,这个类里不需要包含其他的方法 
     * 1.更改测试运行器Suite.class 
     * 2.将要测试的类作为数组传入到Suite.SuiteClasses({}) 
     */
}
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
//“@RunWith”和“@Parameter”用于提供单元测试的参数值,@Parameters必须返回List [],参数将作为参数传入类构造函数。
@RunWith(value = Parameterized.class)
public class ParameterizedTest {
    private int number;

    public ParameterizedTest(int number) {
        this.number = number;
    }

    @Parameterized.Parameters
    public static Collection<Object[]> data() {
        Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };
        return Arrays.asList(data);
    }

    @Test
    public void pushTest() {
        System.out.println("Parameterized Number is : " + number);
    }
}

4. TestNG

TestNG是一个开源自动化测试框架,其灵感来自JUnit和NUnit,TestNG还涵盖了整个核心的JUnit4功能,但引入了一些新的功能,使其功能更强大,使用更方便。
优势:支持依赖测试方法,并行测试,负载测试,局部故障;灵活的插件API;支持多线程测试;

三 go单元测试

1 Go对单元测试的原生支持

1.1 testing——Go内置的单元测试库。
//被测试函数
func addUpper(n int) int {
	res := 0
	for i :=1; i <= n; i++ {
		res += i
	}
	return  res
}
//测试用例文件名必须以_test.go结尾,测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名
//TestXxx(t *testing.T)的形参必须是*testing.T
func TestAddUpper(t *testing.T) {
	//调用
	res := addUpper(10)
	if res != 55 {
		//输出日志然后退出
		t.Fatalf("AddUpper(10) 执行错误,期望值=%v 实际值=%v\n", 55, res)
	}
	//如果正确,输出日志
	t.Logf("AddUpper(10) 执行正确")
}
1.2 TestMain

​ 在写测试时,有时需要在测试之前或之后进行额外的设置(setup)或拆卸(teardown);有时,测试还需要控制在主线程上运行的代码。为了支持这些需求,testing 提供了 TestMain 函数。1.3 httptest——HTTP测试辅助工具

//func TestMain(m *testing.M)
func TestMain(m *testing.M) {
	fmt.Println("begin")
	m.Run()
	fmt.Println("end")
}
1.3 httptest——HTTP测试辅助工具

​ Go 标准库专门提供了 httptest 包专门用于进行 http Web 开发测试。提供了一个 http.ReponseWriter接口的实现结构:httptest.ReponseRecorder,通过它可以得到一个http.ReponseWriter,并以此来接收服务器返回的响应包。

2 gocheck

  • 丰富了单元测试常用的 assert 断言,判断动词deep multi-type 对比,字符串比较以及正则匹配
  • 测试用例组织集合方面按suite组织测试用例,支持suite级别的 setup() 和 teardown()
  • 对于临时文件支持创建、删除临时文件和目录。
import (
	. "gopkg.in/check.v1"
	"testing"
)

func Test(t *testing.T) { TestingT(t) }  //继承testing的方法,可以直接使用go test命令运行

type MySuite struct{}  //创建测试套件结构体

var _ = Suite(&MySuite{})

func (s *MySuite) TestAddUpper(c *C) {  //声明TestHelloWorld方法为MySuite套件的测试用例
	c.Assert(addUpper(10), Equals, 55)
}

3 goconvey

  • 直接集成go test
  • 可以管理和运行测试用例
  • 提供了丰富的断言函数
  • 支持很多 Web 界面特性
import (
	"testing"
	. "github.com/smartystreets/goconvey/convey"
)

func TestEqual(t *testing.T) {
  //每一个Convey语句对应一个测试用例
	Convey("TestEqual should return true ", t, func() {
    //Convey函数的第三个参数闭包的实现中通过So函数完成断言判断
		So(addUpper(10), ShouldEqual, 55)
	})
  //针对想忽略但又不想删掉或注释掉某些断言操作,GoConvey提供了Convey/So的Skip方法
  //当存在SkipConvey或SkipSo时,测试日志中会显式打上"skipped"形式的标记
  //SkipConvey函数表明相应的闭包函数将不被执行
  //SkipSo函数表明相应的断言将不被执行
	Convey("TestEqual should return true", t, func() {
		So(addUpper(10), ShouldEqual, 55)
		SkipSo(addUpper(10), ShouldEqual, 55)
	})
	SkipConvey("TestEqual should return true", t, func() {
		So(addUpper(10), ShouldEqual, 55)
		SkipSo(addUpper(10), ShouldEqual, 55)
	})
}
//Convey语句可以无限嵌套,以体现测试用例之间的关系。只有最外层的Convey需要传入*testing.T类型的变量t。
//以测试函数为单位多个测试用例集中显示的形式
func TestStringSliceEqual(t *testing.T) {
	Convey("TestStringSliceEqual", t, func() {
		Convey("should return true", func() {
			So(addUpper(100), ShouldNotEqual, 55)
		})
	})
}

4 testify

安装:


5 mock/stub方案

5.1 识别依赖
  • 网络依赖——函数执行依赖于网络请求,比如第三方http-api,rpc服务,消息队列等
  • 数据库依赖
  • I/O依赖(文件)
  • 还未开发完成的功能模块
5.2 gostub

特性:可以为全局变量、函数、过程打桩,比gomock轻量,不需要依赖接口
缺陷:对项目源代码有侵入性,即被打桩方法必须赋值给一个变量,只有以这种形式定义的方法才能别打桩

5.3 gomock

特性:golang官方开发维护的接口级别的mock方案,包含了GoMock包和mockgen工具两部分,其中GoMock包完成对桩对象生命周期的管理,mockgen工具用来生成interface对应的Mock类源文件。
缺陷:只有以接口定义的方法才能mock,需要用mockgen生成源文件,然后用gomock去实现自己想要的数据。

5.4 gomonkey

特性:可以为全局变量、函数、过程、方法打桩,同时避免了gostub对代码的侵入。
缺陷:对inline函数打桩无效,不支持多次调用桩函数(方法)而呈现不同行为的复杂情况。

总结:全局变量可通过GoStub框架打桩,interface可通过GoMock框架打桩,过程/函数/方法通过Monkey框架打桩

四 C++单元测试

1. gotest概述

对代码进行单元测试。接口测试也是常见的。可以对类,函数,代码分支进行测试。

2. 安装

git clone https://github.com/google/googletest.git
cd googletest
mkdir -p build && cd build
cmake ..
make
sudo make install

3. DEMO

# CMakeList.txt      在文件中添加头文件和链接库文件,并将链接库文件与目标文件进行链接
# cmake最低版本号要求
cmake_minimum_required(VERSION 3.15)
# 项目名
project(demo_gtest)
set(CMAKE_CXX_STANDARD 17)
# 添加头文件
include_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        ${CMAKE_CURRENT_SOURCE_DIR}/googletest/include
)
# 添加下级目录,生成.a文件
add_subdirectory( ./googletest)
# 添加连接库
link_directories(
        ${CMAKE_CURRENT_SOURCE_DIR}/lib
        ${CMAKE_CURRENT_SOURCE_DIR}/googletest
)
set(SOUCE_FLIES
        main.cpp
        lib/add.cpp
        include/add.h)
# 指定可执行文件的生成位置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
# 指定生成目标
add_executable(Testadd ${SOUCE_FLIES} include/add.h lib/add.cpp)
# 将目标文件与库文件进行链接
target_link_libraries(Testadd gtest)
#lib/add.h
#ifndef DEMO_GTEST_ADD_H
#define DEMO_GTEST_ADD_H
int add(int n1,int n2);
#endif //DEMO_GTEST_ADD_H
#include/add.cpp
int add(int n1,int n2)
{
    return n1+n2;
}
#include <iostream>
#include "lib/add.h"
#include "gtest/gtest.h"

TEST(TestCase,test1 ){
    ASSERT_EQ(12,add(4,8));
}
TEST(TestCase,test2){
    EXPECT_EQ(5,add(2,3));
}
TEST(TestCase,test3){
    EXPECT_EQ(3,add(1,2));
}

int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

3.1 断言
gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:
1.ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
2.EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
3.2 事件机制
gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下gtest的事件一共有3种:
1.全局的,所有案例执行前后。
2.TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
3.TestCase级别的,每个TestCase前后。
3.3 参数化
gtest提供了一个灵活的参数化测试的方案

4. Gmock

Google 的 gtest 框架自带一个 google mock,用于对代码进行 mock 操作。对于测试时难以构造的输入输出条件(例如 rpc 请求,从 db 获取数据),可以通过 mock 的手段进行构造。

5. HMock

Hmock解决了后台单元测试gtest/gmock中静态函数、一般函数、全局函数、函数模版以及非虚函数模版类等不能被mock问题。

五 Objective-C单元测试

​ 现在比较流行的就属Apple自带的XCTest和第三方的GHUnit。区别:XCTest,与Xcode深度集成。 GHUnit:集成度不如XCTest,安装麻烦。但是有自己的GUI界面。 Github上的一些知名的开源库都用的是XCTest,Github上的case例子可以参考,有利于使用。

#import <XCTest/XCTest.h>

@interface TestDemoTests : XCTestCase

@end

@implementation TestDemoTests

- (void)setUp {
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    NSLog(@"test2");
    XCTAssert(1, @"Can not be zero");
}

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
        XCTAssertEqual(2, 2, @"a1 = a2 shoud be true");
    }];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用语言单元测试框架入门 的相关文章

  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • 处理大文件的最快方法?

    我有多个 3 GB 制表符分隔文件 每个文件中有 2000 万行 所有行都必须独立处理 任何两行之间没有关系 我的问题是 什么会更快 逐行阅读 with open as infile for line in infile 将文件分块读入内存
  • 从 InputStream 中删除换行符

    我喜欢从一个文件中删除所有换行符 对于 n 和 r n java io InputStream 在读取文件时 相应的方法如下所示 param target linkplain File return linkplain InputStrea
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • Android ClassNotFoundException:在路径上找不到类

    10 22 15 29 40 897 E AndroidRuntime 2561 FATAL EXCEPTION main 10 22 15 29 40 897 E AndroidRuntime 2561 java lang Runtime
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include
  • 缓存 Flask-登录 user_loader

    我有这个 login manager user loader def load user id None return User query get id 在我引入 Flask Principal 之前它运行得很好 identity loa

随机推荐

  • springboot不同版本整合elasticsearch

    使用springboot整合elasticsearch时候 需要注意版本的对应关系 不然问题会非常多 对应关系如下 springboot2 1整合 elasticsearch的两个方式 通过spring data es springboot
  • Typora软件下载与安装及使用技巧(保姆式教学)

    Typora的下载安装 当前 Typora 是一款支持实时预览的 Markdown 文本编辑器 深受广大程序员的喜爱 简洁明了 方便操作 下面来讲一下它的详细下载安装过程叭 下载安装过程 Typora的下载官网 https typoraio
  • 微信小程序云开发上传图片无法预览显示

    这是图片无法预览显示的情况 而且文件格式显示也不显示为图片格式 不要忘记要在起完名字后加上你希望的图片格式后缀名 加完之后就可以正常显示了
  • Linux链接脚本lds概述

    一 概论 ld 用来把一定量的目标文件跟档案文件链接在一起 并重新定位它们的数据 链接符号引用 一般编译一个程序时 最后一步就是运行ld进行链接 每一个链接过程都由链接脚本 linker script 一般以lds作为文件的后缀名 控制 链
  • 说说你对Object.defineProperty()的理解

    代码在最后 定义 Object defineProperty 方法会直接在一个对象上定义一个新属性 或者修改一个对象的现有属性 并返回此对象 Object defineProperty obj prop descriptor obj 要定义
  • Python糖尿病人预测是否患癌症

    Python糖尿病人预测是否患癌症 统计回归分析的任务 就在于根据x1 x2 x3 xp线性回归和Y的观察值 去估计函数f 寻求变量之间近似的函数关系 我们常用的是 假定f函数的数学形式已知 其中若干个参数未知的观察值去估计未知的参数值 这
  • 网马解密初级篇

    一 网页挂马的概念 网页挂马是指 在获取网站或者网站服务器的部分或者全部权限后 在网页文件中插入一段恶意代码 这些恶意代码主要是一些包括IE等漏洞利用代码 用户访问被挂马的页面时 如果系统没有更新恶意代码中利用的漏洞补丁 则会执行恶意代码程
  • nodejs egg框架统一错误信息返回封装

    use strict app middleware error handler js module exports gt return async function errorHandler ctx next try await next
  • ubuntu内网安装软件

    在生产环境中很少有连接外网的服务器 这里以ansible内网安装为例来介绍 1 安装ansible 有外网 1 ansible的安装包存在于ansible的PPA中 如果要下载PPA 个人软件包存档 就必须要使用apt add reposi
  • C++三角函数计算及弧度制角度制转换

    c 中所有三角函数计算里都是弧度制 用acos算出的弧度t转化为角度的时候 需要t 180 Pi 相对应的 角度换弧度需要t Pi 180 反三角函数 double acos double asin double atan
  • linux怎么看sdb1里面的文件,linux – 什么是sda,sdb,dm-0,dm-1的文档

    如果我运行iostat 我得到了 sda0 sda1 我知道那些是 硬盘 那么有dm 0 dm 1 我想查看文档 我的mount命令也显示了这个 dev mapper VolGroup lv root ext4 usrjquota quot
  • 数据库系统概论(章节重点)

    单词错误 有些地方说的也不是很严谨 大家稍微参考一下即可 祝大家期末顺利 数据库考试重点 题型 30分客观题 20选择10填空或反过来 覆盖面大 关系代数 70分主观题 简答 4 6个理论部分例如简述数据库设计步骤 编程 20 30分 设计
  • input的onchange事件实际触发条件与解决方法

    input中onchange事件已经属于元老级别了 并且现在同onclick一样使用频率很高 然而onchange的机制实际上有很多童鞋并不清楚 我们通过实例来分析这个事件的特征 触发onchange 首先页面有一个input标签 并且已绑
  • python 多线程 线程池的四种实现方式

    python 线程池的四种实现方式 线程简述 一个程序运行起来后 一定有一个执行代码的东西 这个东西就是线程 一般计算 CPU 密集型任务适合多进程 IO密集型任务适合多线程 一个进程可拥有多个并行的 concurrent 线程 当中每一个
  • 【转】开发基于ASP.NET WebService的图片验证码服务

    原文地址 http www webjx com htmldata 2006 01 21 1137824356 html 最近 工作中接到一项任务 开发一个页面验证码功能 查阅了一些网上的资料 并结合以前的绘图方面的知识 实现了如下的解决方案
  • CodeFun如期而至

    背景 将设计稿转代码是前端工程师日常不断重复的工作 这部分工作复杂度较低但工作占比较高 往往又比较枯燥繁琐 有时候开发迭代周期短 静态页面又多 常常让有些前端开发苦不堪言 那么 有没有一款设计稿自动生成代码的工具 减少前端工程师的工作量 提
  • node.js

    node js 关于报错及解决方案 问题一 问题二 问题三 一 Node js基础 1 认识Node js 2 开发环境搭建 3 模块 包 commonJS 4 Npm Yarn 5 内置模块 6 路由 二 Express 1 特色 2 安
  • hadoop 学习笔记

    基于hadoop的贝叶斯文本分类器实现过程 贝叶斯基础理论 这个东西的项目概览 对这个工程总体的流程可以参考这个文献里面的做法即可 参考文献1 远程原件目录 user coderlau input hadoop文件系统命令行主要是hdfs
  • android 电视安装apk文件夹,智能电视无法识别apk文件怎么办?简单几招教你搞定...

    在双十一购买完智能电视后 安装自己喜欢的软件 或许是在正常不过的事情了 但有时候我们会碰到一些APK无法识别 这个时候还以为会认为自己买的是假货 但实际上 这并不是电视的问题 而今天小编就教大家 一旦碰倒APK无法识别时应该如何解决 帮助你
  • 常用语言单元测试框架入门

    本文主要介绍Python java go C OC常用单元测试框架 用于了解各种语言单测 一 python单元测试Pytest 1 Pytest主要功能 pytest是python的一种单元测试框架 同自带的Unittest测试框架类似 相