-
页面beetl代码打桩调式
2019-12-10 17:40:09最后定位问题:copy之前代码时,变量名未修改,导致使用了未经定义的变量。 错误代码如下: @var roles = shiro.getUser().roleNames; var allRoles1 = ""; @for (role in roles) {allRoles = allRoles1 + "," +role...项目后管系统使用了beetl,上线后业务人员发现不能编辑审核员下拉框。最后定位问题:copy之前代码时,变量名未修改完全。
错误代码如下:@var roles = shiro.getUser().roleNames; var allRoles1 = ""; @for (role in roles) {allRoles = allRoles1 + "," +role;} @if (strutil.contain(allRoles,"超级管理员")== true || @strutil.contain(allRoles,"部门管理员")== true || @strutil.contain(allRoles,"对公开户管理员")== true ){ <input> ......</input> @} else { <input readonly="readonly">......</input> @}
开发自测及测试人员测试时使用了admin账号,且admin账号有且仅有一个超级管理员角色,所以逻辑判断返回true,但是业务人员使用的账号还有一个审核员角色,且此角色刚好在最后一个…
emm,经验教训自测及测试不用admin账号,并且cv大法用起来要仔细检查。
简单的问题,恶心的解决过程,值得记录的是beetl中打桩方法:print()或者println()。 -
打桩代码函数
2015-08-24 20:59:01打桩代码函数,c++版本的,希望对大家有帮助。 -
打桩 桩代码
2020-04-07 14:07:25打桩 桩代码1. 打桩 : 假设输出固定值2. 桩代码 : 1. 打桩 : 假设输出固定值 举个例子,中间有个求和函数,我假定它返回5,然后再对参数设置,进行验证结果是不是5 如:return 5; 调试结束后将桩代码删除 2. 桩... -
打桩代码
2014-01-16 15:48:24int a(){ //测试函数,打桩点 printf("this is a func !\n"); return 0; } int main(){ stubInfo si; setStub(a,stub,&si); a(); //此时会调用桩函数 cleanStub(&si); a(); }#include <sys/mman.h> #include <unistd.h> #include <string.h> #include <stdio.h> #define JMP_CMD 0xe9 //相对跳转指令 jmp xxx (总共长5个字节,后四个字节为地址) //0xff 绝对跳转指令:FF typedef struct stubInfo { void *funcAddr; //保存地址 unsigned char byteCode[5]; //保存地址对应的指令 } stubInfo; static void setJumpCode(void *codeAddr, char jumpCode[5]) { int pagesize = sysconf(_SC_PAGE_SIZE);//4096=0x1000 if (mprotect((void*) ((unsigned long) codeAddr & (~(pagesize - 1))), pagesize, PROT_READ | PROT_WRITE | PROT_EXEC) != 0) { //修改页面为可写 return; } memcpy(codeAddr, jumpCode, 5); } void setStub(void *funcAddr, void *stubAddr, stubInfo *si) { char jumpCode[5] = {0xe9}; //跳转指令 int dist = stubAddr - funcAddr - 5; //相对偏移 memcpy((void *)&jumpCode[1], (void *)&dist, sizeof(void *)); si->funcAddr = funcAddr; //保存原函数的地址 memcpy((void *)&si->byteCode[0], (void *)funcAddr, 5); //保存原地址处的指令 setJumpCode(funcAddr, jumpCode); //用跳转指令替换 原地址处的指令 //此函数相当于: //*(char*)funcAddr=0xe9; //*(int*)((char*)funcAddr+1)=stubAddr-funcAddr-5; } void cleanStub(stubInfo *si) { char jumpCode[5]; //用来存放原地处的指令 memcpy((void *)&jumpCode, (void *)&si->byteCode[0], 5); setJumpCode(si->funcAddr, jumpCode); //恢复原地址处的指令 //(省略了还原原地址所在页的保护属性) } 例: int stub(){ //桩函数 printf("this is stub func !\n"); return 0; } int a(){ //测试函数,打桩点 printf("this is a func !\n"); return 0; } int main(){ stubInfo si; setStub(a,stub,&si); a(); //此时会调用桩函数 cleanStub(&si); a(); }
-
桩代码stub 打桩
2017-06-16 16:16:25stub code大概就是占坑的代码,桩代码给出的实现是临时性的/待编辑的。它使得程序在结构上能够符合标准,又能够使程序员可以暂时不编辑这段代码。 举个《C专家编程》中的例子: 我的一位同事需要编写一个程序,...这个问题是我自己问的,那时候正在看《程序员的自我修养》。
这段时间又在一些地方看到了stub code。
stub code大概就是占坑的代码,桩代码给出的实现是临时性的/待编辑的。它使得程序在结构上能够符合标准,又能够使程序员可以暂时不编辑这段代码。
举个《C专家编程》中的例子:
我的一位同事需要编写一个程序,要求在某一地点存储每个文件的文件名和相关信息。数据存储于一个结构表中,他决定使用散列表。这里就需要用到可调试性编码。他并不想一步登天,一次完成所有的任务。他首先让最简单的情况能够运行,就是散列函数总是返回一个0,,这个散列函数如下:int hash_filename(char *s){ return 0;}这个函数的效果就是一个散列表还未被使用。所有的元素都存储在第零个位置后面的链表中,这使得程序很容易调试,因为无需计算散列函数的具体值。
——《C专家编程》186-187页。这个hash_filename函数就是一段桩代码吧?而作者的同事可以放心地完成程序的剩余部分,而无需担心散列表。在最后,他可以再激活这个散列表。
另外我在glibc-2.18中,读到/bits/libc-lock.h这个头文件的时候,第一行的注释是这样的:
/* libc-internal interface for mutex locks. Stub version.
而这个文件的内容是一些宏的定义,这些宏的定义都是空的:
#define __libc_lock_define(CLASS,NAME)#define __libc_lock_define_recursive(CLASS,NAME)#define __rtld_lock_define_recursive(CLASS,NAME)#define __libc_rwlock_define(CLASS,NAME)
而在同等的非stub version的头文件中,这些宏的定义是有实质性的内容的。
就像stub在很多情况下的含义有一些微妙的差别。
-
UT测试与动态打桩源代码
2015-08-26 22:19:42介绍了UT测试框架及动态打桩技术,并配有相关源代码工程,方便开发人员进行代码自测试。 -
java 打桩_认识单元测试中的打桩
2021-02-12 11:27:01打桩就是编写或生成桩代码。打桩的目的打桩的目的主要有:隔离、补齐、控制。隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且与测试... -
库打桩机制
2019-12-25 17:11:53库打桩机制是指可以截获共享库函数的调用,转而执行自己的代码。使用该机制,可以追踪对某个库函数调用次数,验证和追踪它的输入输出值,或者直接替换成自己的实现。 基本思想是:给定一个需要打桩的目标函数,... -
打桩时不修改源码_“偷梁换柱”的库打桩机制
2020-11-28 14:27:19打桩机制LInux链接器有强大的库打桩机制,它允许你对共享库的代码进行截取,从而执行自己的代码。而为了调试,你通常可以在自己的代码中加入一些调试信息,例如,调用次数,打印信息,调用时间等等。本文将介绍三种... -
打桩时不修改源码_嵌入式自动化单元测试(4)-打桩
2020-12-05 01:06:02打桩就是编写或生成桩代码的过程。打桩的目的打桩的目的主要有:隔离隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且与测试任务相关... -
Java单元测试进阶之如何打桩(用easymock轻松打桩)
2015-05-02 14:39:46静态的就是在写测试代码之前根据需要打桩的类生成另外一个类,这个类就是mock object。动态的就是mock object是在测试代码运行的时候才生成的。所以很明显,动态打桩比静态打桩要方便地多。本章就是介绍动态打桩的... -
“偷梁换柱”的库打桩机制
2019-08-01 12:42:10前言 假如由于调试需要,你希望原先代码中的malloc函数更换...LInux链接器有强大的库打桩机制,它允许你对共享库的代码进行截取,从而执行自己的代码。而为了调试,你通常可以在自己的代码中加入一些调试信息,例如... -
单元测试--打桩
2019-07-06 16:52:49打桩就是编写或生成桩代码。 二、打桩的用途 打桩的目的主要有:隔离、补齐、控制。 ①隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的... -
C++test 打桩
2014-12-09 12:03:301 打桩 1.1. 编写源代码和测试代码 1.2. 编写桩函数 [Parasoft]-[显示视图]-[桩函数] [选择原始的(函数)]-[右键创建用户桩函数…] 编写用户桩函数 2 源代码 #include int add(int a,int b) { -
如何实现 JavaScript 工程代码覆盖率统计
2021-01-12 08:37:22基于 AST 技术我们将前端项目的中的代码打桩(插入统计代码) 实现示例 例如 app.js 的代码如下 let App = function(){ this.name_ = 'i am app'; }; App.prototype.sayHi = function(){ alert(this.name_ + '... -
linux库打桩技术
2019-09-24 10:40:14而代之执行 自己的代码。使用打桩机制,你可以追踪对某个特殊库函数的调用次数,验证和追踪它的输入和输出值,甚至把它替换成一个完全不同的实现。 下面是它的基本思想:给定一个需要打桩的目标函数,创建一个包装... -
Linux pg打桩
2019-07-02 20:29:50pg打桩调试技术在调用每个函数中增加一个计数器,来统计函数的调用顺序,待进程崩溃时打印出之前的函数的调用顺序进行问题定位分析。 代码 arm-linux-gnueabihf-gcc -c arm_mcount.c -o arm_mcount.o arm-linux-... -
jmockit 打桩方法
2014-11-10 15:20:29jmockit 打桩方法(1) 用jmockit打桩的方法可能有很多种 总结一下常用的三种 1. 用new MockUp 2. 用Mockit.redefineMethods 3. 用Mockit.setUpMock ...Java代码 public class Biz { -
Java单元测试进阶之如何打桩(扫除打桩的最后一道坎-使用easymockclassextension打桩类)
2015-05-02 14:43:02用easymockclassextension进行类的打桩跟用easymock进行接口的打桩的步骤差不多,能执行的操作也差不多,看看下面代码: 欲打桩类: /************************************************************ * ... -
linux 链接器 库打桩
2017-09-17 15:04:00linux 链接器支持库打桩(library interpositioning), 允许我们截获共享库的调用,执行自己的代码,通过这个机制,可以给程序调试带来很多便利。库打桩实现有三种: - 编译时打桩 - 链接时打桩 - 运行时打桩以下... -
mock打桩之EasyMock
2018-05-22 13:41:00TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD虽是敏捷方法的核心实践,但不只使用于XP(Extreme Programming),同样可以适用于其他开发方法和过程。 打桩(mock)... -
单元测试中的打桩技术
2018-07-01 21:22:53打桩就是编写或生成桩代码。二、打桩的用途打桩的目的主要有:隔离、补齐、控制。①隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且... -
什么是单元测试中的打桩
2020-12-23 23:05:32打桩就是编写或生成桩代码。 打桩的目的 打桩的目的主要有:隔离、补齐、控制。 隔离是指将测试任务从产品项目中分离出来,使之能够独立编译、链接,并独立运行。隔离的基本方法就是打桩,将测试任务之外的,并且... -
oracle存储过程代码覆盖率统计工具
2013-12-06 15:02:00目前针对于高级语言如C++,JAVA,C#等工程都有相关的代码覆盖率统计工具,但是对于oracle存储过程或者数据库sql等方面的项目,代码覆盖率统计和扫描工具相对较...1.代码打桩 获取代码覆盖率的前提是,需要对被测代码... -
认识单元测试中的打桩
2015-07-27 10:19:17什么是桩 ... 桩,或称桩代码,是指用来代替关联代码或者未实现代码的代码。如果函数B用B1来代替,那么,B称为原函数,B1称为桩函数...打桩就是编写或生成桩代码。 打桩的目的 打桩的目的主要有:隔
收藏数
205
精华内容
82