CUnit 单元测试 方法总结

2023-11-07

CUnit是一个用C语言编写,管理和运行单元测试的轻量级系统。它为C程序员提供了基本的测试功能和灵活的各种用户接口.

CUnit被构建为一个与用户的测试代码链接的静态库。 它使用一个简单的框架来构建测试结构,并为测试常见数据类型提供了一套丰富的断言。 此外,还提供了几个不同的接口来运行测试和报告结果。 这些接口目前包括:

Automated      Output to xml file     Non-interactive
Basic     Flexible  programming interface      Non-interactive
Console      Console interface (ansi C)     Interactive
Curses     Graphical interface (Unix)     Interactive
 

点击(此处)折叠或打开

  1. #include <assert.h>
  2. #include <ctype.h>
  3. #include <errno.h>
  4. #include <limits.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <CUnit/Basic.h>
  10. #include <CUnit/Console.h>
  11. #include <CUnit/CUnit.h>
  12. #include <CUnit/TestDB.h>
  13. #include <CUnit/Automated.h>
  14. void test_strlen(void)
  15. {
  16.     char *test_str = "hello world!";
  17.     printf("strlen %d\n", strlen(test_str));
  18.     
  19.     CU_ASSERT(13 == strlen(test_str));
  20. }
  21. static int init_suite1(void)
  22. {
  23.     return 0;
  24. }
  25. static int clean_suite1(void)
  26. {
  27.     return 0;
  28. }
  29. int cu_tests(void)
  30. {
  31.     CU_ErrorCode ret;
  32.     CU_pSuite pSuite = NULL;
  33.     
  34.     ret = CU_initialize_registry();
  35.     if (ret != CUE_SUCCESS) {
  36.         printf("c test initialize failed\n");
  37.         return -1;
  38.     }
  39.     
  40.     printf("c test initialize success\n");
  41.     
  42.     pSuite = CU_add_suite("Suite_1", init_suite1, clean_suite1);
  43.     if (pSuite == NULL) {
  44.         CU_cleanup_registry();
  45.         return CU_get_error();
  46.     }
  47.     
  48.     if (CU_add_test(pSuite, "test of strlen", test_strlen) == NULL) {
  49.         CU_cleanup_registry();
  50.         return CU_get_error();
  51.     }
  52.     
  53.     CU_automated_run_tests();
  54.     
  55.     CU_cleanup_registry();
  56.     printf("clean up all the test case\n");
  57.     return 0;
  58. }
  59. int main(int argc, char * argv[])
  60. {
  61.     cu_tests();
  62.     return 0;
  63. }




CUnit是平台无关的框架与各种用户接口的组合。 核心框架为管理测试注册表,套件和测试用例提供了基本支持。 用户接口便于与框架交互以运行测试和查看结果。
CUnit像传统的单元测试框架一样组织:

Test Registry | ------------------------------ | | Suite '1' . . . . Suite 'N' | | --------------- --------------- | | | | Test '11' ... Test '1M' Test 'N1' ... Test 'NM'


单独的测试用例被打包到套件中,这些套件已在活动测试注册表中注册。 套件可以具有设置和拆卸功能,在运行套件测试之前和之后自动调用它们。 注册表中的所有套件/测试可以使用单个函数调用来运行,或者可以运行选定的套件或测试。

用法:
使用CUnit框架的典型步骤顺序是:
    编写用于测试的函数(如果需要,还可以使用suite init / cleanup)。
     初始化测试注册表 - CU_initialize_registry()
     将套件添加到测试注册表 - CU_add_suite()
     将测试添加到套件 - CU_add_test()
     使用适当的界面运行测试,例如CU_console_run_tests
     清理测试注册表 - CU_cleanup_registry

编写CUnit测试用例:
测试功能
CUnit“测试”是一个C函数,其命名为:

void test_func(void)

除了不应修改CUnit框架(例如,添加套件或测试,修改测试注册表或启动测试运行)之外,对测试功能的内容没有限制。 测试函数可能会调用其他函数(也可能不会修改框架)。 注册测试会导致测试用例运行时运行它的功能。

返回最多2个整数的例程的示例测试函数可能如下所示:

     int maxi(int i1,int i2)
    {
       return(i1> i2)? i1:i2;
    }

     void test_maxi(void)
    {
       CU_ASSERT(maxi(0,2)== 2);
       CU_ASSERT(maxi(0,-2)== 0);
       CU_ASSERT(maxi(2,2)== 2);
    }

CUnit断言:
CUnit提供了一组测试逻辑条件的断言。 这些断言的成功或失败由框架跟踪,并且可以在测试运行完成时查看。

每个断言测试一个逻辑条件,如果条件评估为FALSE,则失败。 失败后,除非用户选择断言的'xxx_FATAL'版本,否则测试功能将继续。 在那种情况下,测试功能被中止并立即返回。 致命的版本断言应谨慎使用! 一旦FATAL断言失败,测试功能就没有机会自行清理。 但是,普通套件清理功能不受影响。

还有一些特殊的“断言”用于在没有进行逻辑测试的情况下注册框架的合格或不合格。 这些对于测试控制流或不需要逻辑测试的其他条件很有用:

void test_longjmp(void) { jmp_buf buf; int i; i = setjmp(buf); if (i == 0) { run_other_func(); CU_PASS("run_other_func() succeeded."); } else CU_FAIL("run_other_func() issued longjmp."); }

断言列表
 

CU_ASSERT(int expression)
CU_ASSERT_FATAL(int expression)
CU_TEST(int expression)
CU_TEST_FATAL(int expression)
Assert that expression is TRUE (non-zero)
CU_ASSERT_TRUE(value)
CU_ASSERT_TRUE_FATAL(value)
Assert that value is TRUE (non-zero)
CU_ASSERT_FALSE(value)
CU_ASSERT_FALSE_FATAL(value)
Assert that value is FALSE (zero)
CU_ASSERT_EQUAL(actual, expected)
CU_ASSERT_EQUAL_FATAL(actual, expected)
Assert that actual = = expected
CU_ASSERT_NOT_EQUAL(actual, expected))
CU_ASSERT_NOT_EQUAL_FATAL(actual, expected)
Assert that actual != expected
CU_ASSERT_PTR_EQUAL(actual, expected)
CU_ASSERT_PTR_EQUAL_FATAL(actual, expected)
Assert that pointers actual = = expected
CU_ASSERT_PTR_NOT_EQUAL(actual, expected)
CU_ASSERT_PTR_NOT_EQUAL_FATAL(actual, expected)
Assert that pointers actual != expected
CU_ASSERT_PTR_NULL(value)
CU_ASSERT_PTR_NULL_FATAL(value)
Assert that pointer value == NULL
CU_ASSERT_PTR_NOT_NULL(value)
CU_ASSERT_PTR_NOT_NULL_FATAL(value)
Assert that pointer value != NULL
CU_ASSERT_STRING_EQUAL(actual, expected)
CU_ASSERT_STRING_EQUAL_FATAL(actual, expected)
Assert that strings actual and expected are equivalent
CU_ASSERT_STRING_NOT_EQUAL(actual, expected)
CU_ASSERT_STRING_NOT_EQUAL_FATAL(actual, expected)
Assert that strings actual and expected differ
CU_ASSERT_NSTRING_EQUAL(actual, expected, count)
CU_ASSERT_NSTRING_EQUAL_FATAL(actual, expected, count)
Assert that 1st count chars of actual and expected are the same
CU_ASSERT_NSTRING_NOT_EQUAL(actual, expected, count)
CU_ASSERT_NSTRING_NOT_EQUAL_FATAL(actual, expected, count)
Assert that 1st count chars of actual and expected differ
CU_ASSERT_DOUBLE_EQUAL(actual, expected, granularity)
CU_ASSERT_DOUBLE_EQUAL_FATAL(actual, expected, granularity)
Assert that |actual - expected| <= |granularity|
Math library must be linked in for this assertion.
CU_ASSERT_DOUBLE_NOT_EQUAL(actual, expected, granularity)
CU_ASSERT_DOUBLE_NOT_EQUAL_FATAL(actual, expected, granularity)
Assert that |actual - expected| > |granularity|
Math library must be linked in for this assertion.
CU_PASS(message) Register a passing assertion with the specified message. No logical test is performed.
CU_FAIL(message)
CU_FAIL_FATAL(message)
Register a failed assertion with the specified message. No logical test is performed.


测试注册表
#include <CUnit/TestDB.h> (included automatically by <CUnit/CUnit.h>)

typedef struct CU_TestRegistry typedef CU_TestRegistry* CU_pTestRegistry CU_ErrorCode CU_initialize_registry(void) void CU_cleanup_registry(void) CU_pTestRegistry CU_get_registry(void) CU_pTestRegistry CU_set_registry(CU_pTestRegistry pTestRegistry) CU_pTestRegistry CU_create_new_registry(void) void CU_destroy_existing_registry(CU_pTestRegistry* ppRegistry)

内部结构
测试注册表是套件和相关测试的存储库。 CUnit维护一个活动的测试注册表,在用户添加一个套件或测试时更新。 这个活动注册表中的套件是当用户选择运行所有测试时运行的套件。

CUnit测试注册表是在中声明的数据结构CU_TestRegistry。 它包括存储在注册表中的套件和测试总数的字段,以及指向注册套件链接列表头部的指针。
 

typedef struct CU_TestRegistry { unsigned int uiNumberOfSuites; unsigned int uiNumberOfTests; CU_pSuite pSuite; } CU_TestRegistry; typedef CU_TestRegistry* CU_pTestRegistry;

用户通常只需在使用前初始化注册表,然后进行清理。 但是,在必要时提供其他功能来操作注册表。

初始化
CU_ErrorCode CU_initialize_registry(void)

活动的CUnit测试注册表必须在使用前初始化。 在调用任何其他CUnit函数之前,用户应该调用CU_initialize_registry()。 不这样做可能会导致崩溃。

返回错误状态码:

CUE_SUCCESS initialization was successful.
CUE_NOMEMORY memory allocation failed.


清除:
void CU_cleanup_registry(void)

当测试完成后,用户应该调用这个函数来清理和释放框架使用的内存。 这应该是所调用的最后一个CUnit函数(除了使用CU_initialize_registry()或CU_set_registry())还原测试注册表。

未能调用CU_cleanup_registry()将导致内存泄漏。 如果不创建错误条件,可能会多次调用它。 请注意,该函数将销毁注册表中的所有套件(和相关测试)。 清理注册表后,指向已注册的套件和测试的指针不应被解除引用。

调用CU_cleanup_registry()只会影响CUnit框架维护的内部CU_TestRegistry。 销毁用户拥有的任何其他测试注册表是用户的责任。 这可以通过调用CU_destroy_existing_registry()来明确地完成,或者通过使用CU_set_registry()使注册表处于活动状态并再次调用CU_cleanup_registry()来隐式地完成。

管理测试和套件

为了让CUnit运行一个测试,它必须被添加到一个在测试注册表中注册的测试集合(套件)。

#include <CUnit/TestDB.h> (included automatically by <CUnit/CUnit.h>)

typedef struct CU_Suite typedef CU_Suite* CU_pSuite typedef struct CU_Test typedef CU_Test* CU_pTest typedef void (*CU_TestFunc)(void) typedef int (*CU_InitializeFunc)(void) typedef int (*CU_CleanupFunc)(void) CU_pSuite CU_add_suite(const char* strName, CU_InitializeFunc pInit, CU_CleanupFunc pClean); CU_pTest CU_add_test(CU_pSuite pSuite, const char* strName, CU_TestFunc pTestFunc); typedef struct CU_TestInfo typedef struct CU_SuiteInfo CU_ErrorCode CU_register_suites(CU_SuiteInfo suite_info[]); CU_ErrorCode CU_register_nsuites(int suite_count, ...);

将套件添加到注册表中

CU_pSuite CU_add_suite(const char* strName, CU_InitializeFunc pInit, CU_CleanupFunc pClean)

创建具有指定名称,初始化函数和清理函数的新测试集合(套件)。 新套件已在测试注册表中注册(并由其拥有),因此注册表必须在添加任何套件之前进行初始化。 当前的实现不支持创建独立于测试注册表的套件。

该套件的名称在注册表中的所有套件中必须是唯一的。 初始化和清理函数是可选的,并且作为指针传递给函数,以在运行套件中包含的测试之前和之后被调用。 这允许套件设置和拆卸临时设备以支持运行测试。 这些函数没有参数,如果成功完成则返回零(否则为非零)。 如果套件不需要这些函数中的一个或两个,则将NULL传递给CU_add_suite()。

返回指向新套件的指针,这是向套件添加测试所需的。 如果发生错误,则返回NULL,并将框架错误代码设置为以下值之一:
 

CUE_SUCCESS suite creation was successful.
CUE_NOREGISTRY the registry has not been initialized.
CUE_NO_SUITENAME strName was NULL.
CUE_DUP_SUITE the suite's name was not unique.
CUE_NOMEMORY memory allocation failed.



添加测试函数到套件:
CU_pTest CU_add_test(CU_pSuite pSuite, const char* strName, CU_TestFunc pTestFunc)

创建一个具有指定名称和测试函数的新测试,并将其注册到指定的套件。 该套件必须已经使用CU_add_suite()创建。 当前的实现不支持创建独立于注册套件的测试。

测试的名称在添加到单个套件的所有测试中必须是唯一的。 测试函数不能为NULL,并且指向运行测试时要调用的函数。 测试函数既没有参数也没有返回值。

返回指向新测试的指针。 如果在创建测试期间发生错误,则返回NULL,并将框架错误代码设置为以下值之一:

CUE_SUCCESS suite creation was successful.
CUE_NOSUITE the specified suite was NULL or invalid.
CUE_NO_TESTNAME strName was NULL.
CUE_NO_TEST pTestFunc was NULL or invalid.
CUE_DUP_TEST the test's name was not unique.
CUE_NOMEMORY memory allocation failed.


管理测试函数的快捷方法:
#define CU_ADD_TEST(suite, test) (CU_add_test(suite, #test, (CU_TestFunc)test))
该宏根据测试函数名称自动生成一个唯一的测试名称,并将其添加到指定的套件中。 返回值应该由用户检查以验证成功。

CU_ErrorCode CU_register_suites(CU_SuiteInfo suite_info[])
CU_ErrorCode CU_register_nsuites(int suite_count, ...)

对于包含许多测试和套件的大型测试结构,管理测试/套件关联和注册非常繁琐且容易出错。 CUnit提供特殊的注册系统来帮助管理套件和测试。 它的主要好处是集中套件和相关测试的注册,并尽量减少用户需要编写的错误检查代码的数量。

测试用例首先被分组到CU_TestInfo实例的数组中(定义在中):

CU_TestInfo test_array1[] = { { "testname1", test_func1 }, { "testname2", test_func2 }, { "testname3", test_func3 }, CU_TEST_INFO_NULL, };


每个数组元素包含单个测试用例的(唯一)名称和测试函数。 数组必须以一个保存NULL值的元素结尾,宏CU_TEST_INFO_NULL便于定义。 包含在单个CU_TestInfo数组中的测试用例构成了将用单个测试套件注册的测试集。

套件信息然后在一个或多个CU_SuiteInfo实例数组中定义(在中定义):

CU_SuiteInfo suites[] = { { "suitename1", suite1_init-func, suite1_cleanup_func, test_array1 }, { "suitename2", suite2_init-func, suite2_cleanup_func, test_array2 }, CU_SUITE_INFO_NULL, };


每个数组元素都包含单个套件的(唯一)名称,套件初始化函数,套件清理函数和CU_TestInfo数组。 像往常一样,如果给定的套件不需要它,NULL可以用于初始化或清理函数。 该数组必须以一个全NULL元素结尾,可以使用宏CU_SUITE_INFO_NULL。

所有在CU_SuiteInfo数组中定义的套件都可以在一个语句中注册:
CU_ErrorCode error = CU_register_suites(suites);
如果在任何套件或测试的注册期间发生错误,则返回错误代码。 错误代码与普通套件注册和测试添加操作返回的错误代码相同。 函数CU_register_nsuites()用于用户希望在一个语句中注册多个CU_SuiteInfo数组的情况:
CU_ErrorCode error = CU_register_nsuites(2, suites1, suites2);
该函数接受可变数量的CU_SuiteInfo数组。 第一个参数表示传递数组的实际数量。

运行测试用例:
#include <CUnit/Automated.h>

void CU_automated_run_tests(void) CU_ErrorCode CU_list_tests_to_file(void) void CU_set_output_filename(const char* szFilenameRoot)

#include <CUnit/Basic.h>

typedef enum CU_BasicRunMode CU_ErrorCode CU_basic_run_tests(void) CU_ErrorCode CU_basic_run_suite(CU_pSuite pSuite) CU_ErrorCode CU_basic_run_test(CU_pSuite pSuite, CU_pTest pTest) void CU_basic_set_mode(CU_BasicRunMode mode) CU_BasicRunMode CU_basic_get_mode(void) void CU_basic_show_failures(CU_pFailureRecord pFailure)

#include <CUnit/Console.h>

void CU_console_run_tests(void)

#include <CUnit/CUCurses.h>

void CU_curses_run_tests(void)

#include <CUnit/TestRun.h> (included automatically by <CUnit/CUnit.h>)

unsigned int CU_get_number_of_suites_run(void) unsigned int CU_get_number_of_suites_failed(void) unsigned int CU_get_number_of_tests_run(void) unsigned int CU_get_number_of_tests_failed(void) unsigned int CU_get_number_of_asserts(void) unsigned int CU_get_number_of_successes(void) unsigned int CU_get_number_of_failures(void) typedef struct CU_RunSummary typedef CU_Runsummary* CU_pRunSummary const CU_pRunSummary CU_get_run_summary(void) typedef struct CU_FailureRecord typedef CU_FailureRecord* CU_pFailureRecord const CU_pFailureRecord CU_get_failure_list(void) unsigned int CU_get_number_of_failure_records(void)

CUnit支持在所有注册套件中运行所有测试,但也可以运行单个测试或套件。 在每次运行期间,框架会跟踪运行,传递和失败的套件,测试和断言的数量。 请注意,每次启动测试运行时都会清除结果(即使失败)。

虽然CUnit提供了用于运行套件和测试的原始函数,但大多数用户都希望使用其中一个简化的用户界面。 这些接口处理与框架交互的细节,并为用户提供测试细节和结果的输出。

CUnit库中包含以下接口:
Interface Platform Description
Automated all non-interactive with output to xml files
Basic all non-interactive with optional output to stdout
Console all interactive console mode under user control
Curses Linux/Unix interactive curses mode under user control

自动模式
自动化界面是非交互式的。 客户端启动测试运行,并将结果输出到XML文件。 注册测试和套件的列表也可以报告给XML文件。

以下功能组成了自动化接口API:
void CU_automated_run_tests(void)
运行所有注册套件中的所有测试。 测试结果输出到名为ROOT-Results.xml的文件。 文件名ROOT可以使用CU_set_output_filename()来设置,否则使用默认的CUnitAutomated-Results.xml。 请注意,如果在每次运行之前未设置distict filename ROOT,结果文件将被覆盖。

结果文件由文档类型定义文件(CUnit-Run.dtd)和XSL样式表(CUnit-Run.xsl)支持。 这些在源和安装树的Share子目录中提供。
CU_ErrorCode CU_list_tests_to_file(void)
列出要注册的套件和相关测试。 列表文件名为ROOT-Listing.xml。 文件名ROOT可以使用CU_set_output_filename()来设置,否则使用默认的CUnitAutomated。 请注意,如果在每次运行之前未设置distict filename ROOT,则列表文件将被覆盖。

列表文件由文档类型定义文件(CUnit-List.dtd)和XSL样式表(CUnit-List.xsl)支持。 这些在源和安装树的Share子目录中提供。

另请注意,清单文件不是由CU_automated_run_tests()自动生成的。 客户代码必须在需要时明确请求列表。
void CU_set_output_filename(const char* szFilenameRoot)
设置结果和列表文件的输出文件名。 szFilenameRoot分别用于附加-Results.xml和-Listing.xml来构造文件名。

错误处理:
#include <CUnit/CUError.h> (included automatically by <CUnit/CUnit.h>)

typedef enum CU_ErrorCode CU_ErrorCode CU_get_error(void); const char* CU_get_error_msg(void); typedef enum CU_ErrorAction void CU_set_error_action(CU_ErrorAction action); CU_ErrorAction CU_get_error_action(void);



大多数CUnit函数都会设置一个指示框架错误状态的错误代码。 一些函数返回代码,而其他函数只是设置代码并返回其他值。 提供了两个函数来检查框架错误状态:

CU_ErrorCode CU_get_error(void)
const char* CU_get_error_msg(void)

第一个返回错误代码本身,而第二个返回描述错误状态的消息。 错误代码是中定义的CU_ErrorCode类型的枚举。 定义了以下错误代码值:

Error Value Description
CUE_SUCCESS No error condition.
CUE_NOMEMORY Memory allocation failed.
CUE_NOREGISTRY Test registry not initialized.
CUE_REGISTRY_EXISTS Attempt to CU_set_registry() without CU_cleanup_registry().
CUE_NOSUITE A required CU_pSuite pointer was NULL.
CUE_NO_SUITENAME Required CU_Suite name not provided.
CUE_SINIT_FAILED Suite initialization failed.
CUE_SCLEAN_FAILED Suite cleanup failed.
CUE_DUP_SUITE Duplicate suite name not allowed.
CUE_NOTEST A required CU_pTest pointer was NULL.
CUE_NO_TESTNAME Required CU_Test name not provided.
CUE_DUP_TEST Duplicate test case name not allowed.
CUE_TEST_NOT_IN_SUITE Test is not registered in the specified suite.
CUE_FOPEN_FAILED An error occurred opening a file.
CUE_FCLOSE_FAILED An error occurred closing a file.
CUE_BAD_FILENAME A bad filename was requested (NULL, empty, nonexistent, etc.).
CUE_WRITE_ERROR An error occurred during a write to a file.



遇到错误情况时的默认行为是要设置错误代码并继续执行。 客户可能有时候喜欢测试运行,以防止出现框架错误,甚至不希望测试应用程序退出。 这种行为可以由用户设置,为此提供了以下功能:

void CU_set_error_action(CU_ErrorAction action)
CU_ErrorAction CU_get_error_action(void)

错误操作代码是中定义的CU_ErrorAction类型的枚举。 定义了以下错误操作代码:

Error Value Description
CUEA_IGNORE Runs should be continued when an error condition occurs (default)
CUEA_FAIL Runs should be stopped when an error condition occurs
CUEA_ABORT The application should exit() when an error conditions occurs

本文转载至:http://blog.chinaunix.net/uid-25242461-id-5784456.html

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

CUnit 单元测试 方法总结 的相关文章

  • 【性能测试入门】:压力测试概念!

    压力测试可以验证软件应用程序的稳定性和可靠性 压力测试的目标是评估软件在极端负载条件下的鲁棒性和错误处理能力 并确保软件在紧急情况下不会崩溃 它甚至可以进行超出软件正常工作条件的测试 并评估软件在极端条件下的工作方式 在软件工程中 压力测试
  • 真的干不过,00后整顿职场已经给我卷麻了,想离职了...

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • 软件测试|好用的pycharm插件推荐(五)——Translation

    前言 在我们的日常工作中 经常会遇到需要查看各个第三方库源码的问题 在很多情况下 我们的英语能力不能够满足我们完全读懂源码 所以我们就需要借助翻译工具来帮助我们理解第三方库的源码 如果我们将源码复制再使用其他工具翻译 会显得比较繁琐 如果有
  • Linux终端常见用法总结

    熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率 笔者结合自身学习实践 总结以下终端用法供同行交流学习 常 见 用 法 1 快捷键 1 1 Alt 在光标位置插入上一次执行命令的最后一个参数 1 2 Ctrl R
  • RF自动化环境安装+自动化实例解析

    RF定义 通用型的 自动测试框架 绝大部分的软件的的自动化系统都可以采用它 特点 测试数据文件 Test Data 对应一个个的测试用例 测试数据文件里面使用的功能小模块叫关键字 由测试库 Test Library Robot Framew
  • Python自动化操作:简单、有趣、高效!解放你的工作流程!

    今天跟大家分享一套自动化操作流程解决方案 基于 Python语言 涉及 pyautogui pyperclip pythoncom win32com 依赖包 安装命令为 pip install pyautogui pip install p
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • Jmeter 性能-并发量计算

    并发概念 指网站在同一时间访问的人数 人数越大瞬间带宽要求更高 服务器并发量分为 业务并发用户数 最大并发访问数 系统用户数 同时在线用户数 估算业务并发量的公式 C nL T C C 3 C的平方根 说明 C是平均的业务并发用户数 n是l
  • 微信小程序的自动化测试框架

    微信发布了小程序的自动化测试框架Minium 提供了多种运行验证方式 其特点 支持一套脚本 iOS Android 模拟器 三端运行 提供丰富的页面跳转方式 看不到也能去得到 可以获取和设置小程序页面数据 让测试不止点点点 可以直接触发小程
  • 基于Loadrunner的性能分析及调优经验分享

    公司某个系统的微信端计划将开放给几百上千的人员登录查询 并且登录账号为同一账号多人使用 后台服务能够支撑起多用户的并发操作以及成百上千人登录微信端对生产数据库或者登录查询的性能效率高成为交付可靠生产环境的必要条件 因此 项目组决定提交测试
  • 软件测试|Pydantic详细介绍与基础入门

    简介 Pydantic 是一个强大的 Python 库 用于数据验证和解析 特别是用于处理 JSON 数据 它的主要目标是使数据验证和解析变得简单 直观和可维护 本文将介绍 Pydantic 的基础知识 包括如何定义模型 验证数据以及处理错
  • 软件测试|web自动化测试神器playwright教程(三十八)

    简介 在我们使用selenium时 我们可以获取元素的属性 元素的文本值 以及输入框的内容等 作为比selenium更为强大的web自动化测试神器 playwright也可以实现对元素属性 文本值和输入框内容的抓取 并且实现比seleniu
  • 软件测试|使用matplotlib绘制多种柱状图

    简介 在数据可视化领域 Matplotlib是一款强大的Python库 它可以用于创建多种类型的图表 包括柱状图 本文将介绍如何使用Matplotlib创建多种不同类型的柱状图 并提供示例代码 创建基本柱状图 首先 让我们创建一个基本的柱状
  • 一篇文章带你了解Python常用自动化测试框架——Pytest

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Jmeter 性能-阶梯负载最终请求数

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • msyql 异常,别干着急,70%的问题都在这里!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读2 3k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 一文让你了解UI自动化测试

    测试都起什么作用 是项目的保险 但不是项目的救命草 测试无实际产出 但作用远大于实际产出 测试是从项目维度保证质量 而不是测试阶段 UI自动化 下面简称自动化 基于UI进行自动功能测试 以Web端作为例子 一般的UI功能自动化都是基于HTM
  • 15:00面试,15:06就出来了,问的问题有点变态。。。

    从小厂出来 没想到在另一家公司又寄了 到这家公司开始上班 加班是每天必不可少的 看在钱给的比较多的份上 就不太计较了 没想到9月一纸通知 所有人不准加班 加班费不仅没有了 薪资还要降40 这下搞的饭都吃不起了 还在有个朋友内推我去了一家互联
  • UI自动化测试之Jenkins配置

    背景 团队下半年的目标之一是实现自动化测试 这里要吐槽一下 之前开发的测试平台了 最初的目的是用来做接口自动化测试和性能测试 但由于各种原因 接口自动化测试那部分功能整个废弃掉了 其中和易用性有很大关系 另外 也和我们公司的接口业务也有关
  • Airtest自动化测试工具

    一开始知道Airtest大概是在年初的时候 当时 看了一下官方的文档 大概是类似Sikuli的一个工具 主要用来做游戏自动化的 通过截图的方式用来解决游戏自动化测试的难题 最近 移动端测试的同事尝试用它的poco库来做自动化 看样子还不错

随机推荐

  • svn下载及使用

    下载 链接 https pan baidu com s 1RV6vAujA1anHhXJuKbItUQ pwd flzx 提取码 flzx 这是svn安装包以及中文安装包 放在百度网盘了 有需要可以下载 注意 svn中文语言包安装的版本需要
  • 【ag-grid-vue】基本使用

    ag grid是一款功能和性能强大外观漂亮的表格插件 ag grid几乎能满足你对数据表格所有需求 固定列 拖动列大小和位置 多表头 自定义排序等等各种常用又必不可少功能 关于收费的问题 绝大部分应用用免费的社区版就够了 ag grid c
  • this.$msgbox创建弹窗,提示文字绑定事件-element ui + vue项目

    setDiloag const h this createElement var that this 注意 this msgbox title 提示 message h p null h span null 申请已提交成功 您可以在 on
  • 机器学习第八课--决策树

    举个例子 明天如果下雨我就不出门了 在这里我们用了一个决策条件 是否下雨 然后基于这个条件会有不同的结果 出门和不出门 这就是一个经典的决策树 决策树的核心组成部分 节点 边 最后的结论就是第一个决策树要优于第二个决策树 因为它的准确率更高
  • openGL之API学习(七十)windows的opengl扩展wgl

    WGL扩展说白了是Windows操作系统和OpenGL做交互的一系列扩展 glut也好 其他框架也好 都是对这些接口进行了封装 之前的文章也提到了 Windows在对OpenGL的原生支持非常不友好 甚至差点就夭折了 在wingdi h这个
  • CSRF攻击原理及防护

    CSRF攻击原理及防护 0x01 CSRF是什么 ssrf 服务端请求伪造 CSRF全称为跨站请求伪造 Cross site request forgery 是一种网络攻击方式 也被称为 one click attack 或者 sessio
  • Robot Framework 基于图像识别的 C/S 自动化测试 --- 从入门到实战

    目录 引子 雏形 库的选择 实施过程 1 导入并改造ImageHorizonLibrary 使其支持中文路径和中文名称 2 基于目录结构的Page Object封装 3 通过传统手段选获取页面文字内容的方法 1 通过鼠标三击获取字符串内容
  • Qt实现多选文件夹对话框

    简述 Qt使用QFileDialog类可以实现文件选择对话框 多文件选择对话框 以及文件夹选择对话框 就是没有多文件夹选择对话框 做的并不是很完美无法直接调用win下的原生对话框 下面将介绍一下Qt实现多选文件夹对话框的两种方式 目录 使用
  • Web项目之网络爬虫

    一 爬虫基础篇 Python网络爬虫 认识爬虫 Python网络爬虫 http和https协议 Python网络爬虫 基于urllib库的get请求页面 Python网络爬虫 requests模块应用1 Python网络爬虫 验证码处理 P
  • 水下图像——不平衡衰减相关文献阅读

    目录 不平衡衰减 相关文献 1 Underwater Single Image Color Restoration Using Haze Lines and a New Quantitative Dataset 1 2 Underwater
  • 电感怎么掌握?读懂本文就够了

    一提到电感 不少做设计的同事就发憷 因为不知道电感要怎么用选 很多时候 就像薛定谔的猫一样 只有打开了盒子 才知道猫是不是死的 只有电感实际在电路中焊上去 用起来了 才知道用的对不对 用的好不好 为什么电感这么难搞 因为电感涉及到电磁场 而
  • Web项目中获取SpringBean——在非Spring组件中获取SpringBean

    自定义一个工具类 实现自ApplicationContextAware接口 接口的方法是setApplicationContext 我们实现它 并让其为我们服务 因为Spring在load自己的时候会将上下文环境填充进来 我们所要做的就是将
  • 微服务体系下如何快速构建一个服务

    近两三年的时间 微服务是热度陡增 作为旧有SOA体系的一下特殊展现 在企业级应用市场上面应用越来越广泛 越来越多的团队 开始采用微服务架构来改造现有的架构体系 不管实施的情况如何 至少已经有成形的案例在线上跑 哪我们这些远未达到微服务架构的
  • 谷粒商城详细笔记

    前言 mysql安装在腾讯云 redis安装在本地虚拟机master上 运行时 renren fast这个项目要到单独开个idea窗口打开 一 项目简介 1 项目微服务架构图 微服务 拒绝大型单体应用 基于业务边界进行服务微化拆分 各个服务
  • 浏览器如何使用断点调试?

    在浏览器中按下F12进入开发者模式 点击Sources gt 选中相应的html文件 gt 在对应的代码行前点击 出现小红点 断点 再次运行 在执行到断点时就会停下 等待按下F9 F12才会向下执行 F11执行下一步 F9 返回上一步 将鼠
  • python3安装Pillow(PIL)

    本方法亲测可用 我的是win7 32位 Python3 4 官网上还没有支持Python3的PIL 使用Pillow代替PIL 首先 下载对应的whl文件 来源http www lfd uci edu gohlke pythonlibs 4
  • n个数分为两组,两组数的个数尽可能相等,差值最小

    题目描述 对于有n个数的数组 分为两组 这两组的数的个数尽可能相等 不超过1 同时两组的数之和的差值最小 这个题目使用类似0 1背包问题 思路 从k个数中选i个数 求所有可能的和 并把这些和放在flag中用true表示 k i flag见代
  • ubuntu忘记root密码怎么办?

    普通用户 无论你是否申请了root帐号 或是普通账号密码忘记了都没有问题的 首先 重启ubuntu 随即长按shift进入grub菜单 其次 选择第二个高级模式recovery mode进入Recovery Menu界面 选择root Dr
  • jsp代码中EL表达式无法显示(已解决)

    jstl最近是不是有问题 还是我的代码有问题 每次遍历都不会出来 都是显示这样 有的说是必须要有jstl jar和 standard jar 但是我也有了 但是也是没有说打刀口上 其实是忽略了一个知识点 EL表达式 在这里加上 isELIg
  • CUnit 单元测试 方法总结

    CUnit是一个用C语言编写 管理和运行单元测试的轻量级系统 它为C程序员提供了基本的测试功能和灵活的各种用户接口 CUnit被构建为一个与用户的测试代码链接的静态库 它使用一个简单的框架来构建测试结构 并为测试常见数据类型提供了一套丰富的