精华内容
下载资源
问答
  • 软件测试技巧.pdf

    2020-11-20 14:16:38
    软件测试技巧.pdf
  • PHP中的示例单元测试技巧 介绍 在这些时候,编写单元测试的好处是巨大的。 我认为大多数最近启动的项目都包含任何单元测试。 在具有大量业务逻辑的企业应用程序中,单元测试是最重要的测试,因为它们是快速的,并且...
  • 单据测试技巧

    2018-04-04 16:59:40
    软件测试,单据测试,测试技巧,测试管理,测试分享。
  • 单元测试中用到的一些基本技巧,从不同的维度不同的方向简述单元测试技巧。为什么要进行单元测试,单元测试遵循的原则,单元测试的放法
  • PHP实例中的单元测试技巧简介在这些时候,编写单元测试的好处是巨大的。 我认为最近通过PHP中的示例开始的大多数单元测试技巧都引言在这段时间里,编写单元测试的好处是巨大的。 我认为大多数最近启动的项目都包含...
  • 掌握常用的Kali Linux渗透测试技巧   二、课程特点        注重实战,跟着操作,容易上手学会!   三、你将学到        Kali Linux渗透攻防实战技巧   四、...
  • cms系统简介及测试技巧.doc
  • 渗透测试提示 渗透测试技巧
  • burp-盲注测试技巧

    2017-05-03 17:53:04
    burp盲注测试技巧
  • Camera测试技巧总结

    千次阅读 2020-03-08 19:19:13
    1.针对相机类型,编写相应测试程序(用例代码编写)。 2.Camera驱动指令的记忆与编写。 3.测试环境的搭建,光学,IT,耐用性测试。 4.不同色温的白平衡调试 5.待机电流测试 6.FAE现场调试 7.寄存器的参数模拟 8.解析...

    1.针对相机类型,编写相应测试程序(用例代码编写)。
    2.Camera驱动指令的记忆与编写。
    3.测试环境的搭建,光学,IT,耐用性测试。
    4.不同色温的白平衡调试
    5.待机电流测试
    6.FAE现场调试
    7.寄存器的参数模拟
    8.解析度、色彩还原、几何失真
    9.24色色卡、色温照度测试剂、21阶灰卡、动态范围测试
    10.中心解析度、边角解析额度(核心)
    11.ISO12233参照
    12.对照试验,对照样的解析度测试
    13.Camera供应商的参数测试,尤其镜头一块
    14.应用场景测试
    15.坏点,噪点测试
    16.Camera驱动: Framework层、C/S结构、硬件抽象层HAL、Drive层
    17.Camera驱动在Linux内核移植
    18. 模组CMM
    19.CMOS或CCD集成电路
    20.图片处理芯片DSP

    展开全文
  • 最近的非常全面的web渗透测试技巧,网络攻防教程
  • 有关的一些相关的c++中相关的单元测试的技术和方法。主要针对c++喔!
  • 微信小程序渗透测试技巧

    千次阅读 2021-07-20 00:18:28
    随着小程序数量的爆发式增长,其特有的安全风险也逐步凸显出来。本文基于微信小程序测试过程中的解包及抓包的技巧,总结下微信小程序安全测试的思路。1、小程序解包(反编译)(1)安装手机模拟器,比...

    随着小程序数量的爆发式增长,其特有的安全风险也逐步凸显出来。本文基于微信小程序测试过程中的解包及抓包的技巧,总结下微信小程序安全测试的思路。


    1、小程序解包(反编译)

    (1)安装手机模拟器,比如说夜神、MuMu

    (2)下载和安装两个应用,微信和RE文件管理器

    (3)获取root权限

    (4)打开微信,搜索相对应的小程序,然后再打开RE文件管理器,定位到目录:

    (5)下载微信小程序反编译脚本,解包。

    https://github.com/xuedingmiaojun/wxappUnpacker.git
    

    解主包:

    ./bingo.sh 主包.wxapkg
    
    

    解分包:

    ./bingo.sh 分包.wxapkg -s=主包目录
    
    

    合并分包内容,成功获取小程序前端源码。

    基于小程序的前端源码,我们可以从JS敏感信息泄露、隐藏接口漏洞等方向进行漏洞挖掘。

    2、小程序抓包

    抓取数据包是小程序安全测试中最关键的一步。抓包的方式有多种,比如使用Android内核版本7.0以下的模拟器,通过XPosed+JustTrustMe抓包;使用微信版本7.0以下通过Burp CA抓包。

    这里分享一个比较简单的方法,使用Charles进行小程序抓包。

    (1)环境准备

    本机电脑开启Wifi共享,将自己手机和电脑连上同一个wifi。

    (2)Charles设置:

    下载地址:

    https://www.charlesproxy.com/download/
    

    第一步:配置HTTP代理,设置代理:主界面—Proxy—Proxy Settings

    选择在8888端口上监听,然后确定。勾选了SOCKS proxy,还能截获到浏览器的http访问请求。

    第二步:配置SSL代理:首先在charles的 Proxy选项选择SSL Proxy Settings

    第三步:为手机设置代理

    在手机接入电脑wifi,配置手动代理,输入安装Charles的电脑的网络地址,端口填8888。以IOS为例,在Safri上打开Charles的根证书下载网址: chls.pro/ssl ,点击允许,开始下载。

    第四步:SSL 代理设置,在Proxy-SSL Proxying Settings,添加域名

    到这里完成设置,通过手机访问就可以看到获取到小程序的数据包。

    基于小程序的数据包,我们可以看到前后端业务交互的过程,重点关注业务逻辑漏洞、API 接口可能存在的安全漏洞。

    展开全文
  • 安卓测试技巧

    2018-06-20 11:44:26
    安卓测试技巧,软件测试必备!安卓测试技巧,软件测试必备!安卓测试技巧,软件测试必备!
  • 软件测试技巧和实践

    2012-06-22 22:54:41
    软件测试技巧和实践,是神州数码内部的高级软件测试
  • 软件单元测试技巧

    2012-08-18 18:25:19
    软件单元测试技巧PPT,讲述单元测试的基本方法和常用工具
  • web测试技巧、经验

    2011-05-13 14:08:45
    web测试2.docx,介绍了web测试中的一些技巧,下载下来进行参考吧,肯定对你有用。web测试2.docx,介绍了web测试中的一些技巧,下载下来进行参考吧,肯定对你有用。web测试2.docx,介绍了web测试中的一些技巧,下载下来...
  • 一些常见的软件测试技巧 一些常见的软件测试技巧
  • 测试技巧 – 你所不知道的测试黑科技 技巧一:处理实例化 在我想办法让我的Android App通过Unit Test和Integration Test的过程中,我积累了一些小的经验与技巧,可以成功的处理比较麻烦的代码。展示开始: ...

    测试技巧 – 你所不知道的测试黑科技

    技巧一:处理实例化

    在我想办法让我的Android App通过Unit Test和Integration Test的过程中,我积累了一些小的经验与技巧,可以成功的处理比较麻烦的代码。展示开始:

    问题代码

    我想测试这段代码

    public void readDeepLink(String path) {
        new DeepLinkReader().readDeepLink(path);
    }
    

    我只是想确保readDeepLink()方法执行了,但是我不想真的实例化DeepLinkReader因为这会引起网络操作。所以怎么修改呢?

    解决方法

    将实例化DeepLinkReader的代码封装到另外一个方法中,这样就可以用一个mock覆盖这个方法,这就可以避免在测试时实例化DeepLinkReader而可以使用Mockito来确认mock方法的执行。

    解决代码

    //在MainPresenter.java中
    public void readDeepLink(String path) {
        getDeepLinkReader().readDeepLink(path);
    }
    
    DeepLinkReader getDeepLinkReader() {
        return new DeepLinkReader(currentData, events);
    }
    
    //在MainPresenterTest.java中
    @Mock private DeepLinkReader deepLinkReader;
    
    @Test  
    public void shouldReadDeepLink() throws Exception {  
        MainPresenter mainPresenter = new MainPresenter() {  
    
            DeepLinkReader getDeepLinkReader() {  
                return deepLinkReader;  
            }  
        };  
    
        mainPresenter.readDeepLink("washingtonpost.com");  
    
        verify(deepLinkReader).readDeepLink("washingtonpost.com");  
    }
    

    技巧二:第三方类库

    当你在为Anddroid App编写单元测试时,可能经常要处理第三方类库的API。在下面的代码中我用Picasso加载图片。Picasso的类库非常简洁,所以很好操作,但当你用其他的第三方类库时可能就不是这样了。所以我们怎么简化和第三方类库的交互而同时编写可维护性强的代码呢?

    Picasso.with(contextLocal)
        .load(book.getImageUrl())
        .resize(80,108)
        .centerInside()
        .into(viewHolder.imageView)
    

    我们可以将对第三方类库(这里以 Picasso 为例)的调用封装到另一个类中,使我们可以使用API并通过Assertion进行测试。

    原始代码

    //MyClass.class
    public void loadImageFromUrl(String imageUrl) {
        presenter.setCurrentPreviewImageUrl(imageUrl);
        if (showThumbImage) {
            Picasso.with(context)
                .load(imageUrl)
                .into(thumbImageView);
        }
    }
    

    在这个 loadImageFromUrl 方法中,我们希望确保我们的 Presenter 被调用了,而且当showThumbImage 是 true 的时候加载图片。因为我们想在单元测试中验证这一点,所以我们不想真正加载这张图片。

    为了达到目标我们新建两个类:ImageLoader 和 ImageLoaderImpl,第一个是用于暴露API的接口,第二个是实现了第一个接口的类,用于封装调用第三方API的操作。

    修改代码

    // ImageLoader interface
    public interface ImageLoader {  
        void loadImage(String imageUrl, ImageView imageView);  
    }
    
    // ImageLoaderImpl class
    public class ImageLoaderImpl implements ImageLoader {
        // fields omitted  
        @Override  
        public void loadImage(String imageUrl, ImageView imageView) {  
            Picasso.with(context).load(imageUrl).into(imageView);  
        }  
    }
    
    //loadImageFromUrl method
    public void loadImageFromUrl(String imageUrl) {
        presenter.setCurrentPreviewImageUrl(imageUrl);
        if (showThumbImage) {
            imageLoader.loadImage(imageUrl, thumbImageView);
        }
    }
    

    Unit Test

    //MyClass
    @Mock private ImageLoader imageLoader;  
    
    @Test  
    public void shouldLoadImageWhenShowThumbIsTrue() throws Exception {  
        myClass.setShowThumbImage(true);
        myClass.loadImageFromUrl("http://www.myimageurl.png");
        verify(imageLoader).loadImage(anyString(), any(ImageView.class));
    }
    
    @Test  
    public void shouldNotLoadImageWhenShowThumbIsFalse() throws Exception {  
        myClass.setShowThumbImage(false);
        myClass.loadImageFromUrl("http://www.myimageurl.png");
        verifyZeroInteractions(imageLoader);
    } 
    

    在这两个单元测试中我们可以成功地测试了 Image Loader 的相关操作而无需关心第三方API。而且如果将来要使用其他的图片加载类库,也无需改变测试代码。


    技巧三:提高可读性

    可读性是高质量测试代码的重要指标之一,而我们有可能会因为在测试中添加了无用的信息而降低可读性,来看个实例。

    例子

    我们现在要测试我们用于创建 Video Object 的URL与调用 VideoPlaybackService 中的playCurrentVideo 方法的返回值适配。我们编写了一个helper方法,可以传入用于实例化 Video Object 的一些参数。但是大多数情况下我们不需要设置所有的参数,比如 duration 和displayDate 对于这个方法的测试就不起到任何作用。也就是说,我们在测试中添加了额外的且无用的信息,使测试代码可读性降低。

    @Test
    public void shouldReceiveCurrentUrlWhenVideoAvailable() {
        String url = "http://www.my_video.mp4";
        String displayDate = "Jan. 08, 2016";
        double duration = 0.30;
    
        playbackService.setCurrentVideo(createVideo(url, displayDate, duration));
    
        String actualUrl = playbackService.playCurrentVideo();
    
        assertEquals("the urls are not the same", url, actualUrl);
    }
    
    private Video createVideo(String url, String displayDate, double duration) {
        Video video = new Video();
        video.setUrl(url);
        video.setDisplayDate(displayDate);
        video.setDuration(duration);
    
        return video;
    }
    

    解决方案

    我们可以通过使用建造者(Builder)模式优化 Video 类,从而使额外的属性不再是必需的。下面是视频的URL的setter方法的未经优化的代码。

    public void setUrl(String url) {
        this.url = url;
    }
    

    我们可以升级这个方法,使它回传Video对象(this)而不是返回空。让我们看一看这可以怎样增强测试代码的可读性和理解性。

    使用建造者模式

    public Video setUrl(String url) {
        this.url = url;
        return this;
    }
    
    @Test
    public void shouldReceiveCurrentUrlWhenVideoAvailable() {
        String url = "http://www.my_video.mp4";
        playbackService.setCurrentVideo(new Video().setUrl(url));
    
        String actualUrl = playbackService.playCurrentVideo();
    
        assertEquals("the urls are not the same", url, actualUrl);
    }
    

    这样代码就具有更强的可读性和可维护性了。

    展开全文
  • 在本篇文章中我们将介绍软件工程师都可以使用的12个单元测试技巧,适用于任何编程语言和编程环境
  • Go的单元测试技巧

    千次阅读 2018-09-17 01:10:24
    遂花时间学习整理了一下单元测试的基本方法,以及在Go中的实践技巧。 单元测试的难点 以下是我在尝试进行单元测试的过程中遇到的一些难点,在下文中会介绍相应的一些应对方案。 1.掌握单元测试粒度 ...

    单元测试(Unit Test)

    Go语言原生支持测试工具go test,省去了各种各样测试框架的学习成本。说来也惭愧,写代码这么些年,也从来没有给自己的代码写过单元测试,代码质量的确堪忧。遂花时间学习整理了一下单元测试的基本方法,以及在Go中的实践技巧。

    单元测试的难点

    以下是我在尝试进行单元测试的过程中遇到的一些难点,在下文中会介绍相应的一些应对方案。

    1.掌握单元测试粒度

    单元测试粒度是让人十分头疼的问题,特别是对于初尝单元测试的程序员(比如我)。测试粒度做的太细,会耗费大量的开发以及维护时间,每改一个方法,都要改动其对应的测试方法。当发生代码重构的时候那简直就是噩梦(因为你所有的单元测试又都要写一遍了…)。 如单元测试粒度太粗,一个测试方法测试了n多方法,那么单元测试将显的非常臃肿,脱离了单元测试的本意,容易把单元测试写成__集成测试__。

    2. 破除外部依赖(mock,stub 技术)

    单元测试中是不允许有任何外部依赖的,也就是说这些外部依赖都需要被模拟(mock)。外部依赖越多,mock越复杂。如何用模拟的依赖来测试真实依赖的行为?mock写的太简单,达不到测试的目的。mock太复杂, 不仅成本增加,而且又如何确保mock的正确性呢?

    有的时候模拟是有效的方便的。但是其他一些时候,过多的模拟对象,Stub对象,假对象,导致单元测试主要在测模拟对象而不是实际的系统。

    Costs and Benefits

    在受益于单元测试的好处的同时,也必然增加了代码量以及维护成本(单元测试代码也是要维护的)。下面这张成本/价值象限图很清晰的阐述了在不同性质的系统中单元测试__成本__和__价值__之间的关系。

    这里写图片描述

    1.依赖很少的简单的代码(左下)

    对于外部依赖少,代码又简单的代码。自然其成本和价值都是比较低的。举Go官方库里errors包为例,整个包就两个方法New()Error(),没有任何外部依赖,代码也很简单,所以其单元测试起来也是相当方便。

    2. 依赖较多但是很简单的代码(右下)

    依赖一多,mock和stub就必然增多,单元测试的成本也就随之增加。但代码又如此简单(比如上述errors包的例子),这个时候写单元测试的成本已经大于其价值,还不如不写单元测试

    3. 依赖很少的复杂代码 (左上)

    像这一类代码,是最有价值写单元测试的。比如一些独立的复杂算法(银行利息计算,保险费率计算,TCP协议解析等),像这一类代码外部依赖很少,但却很容易出错,如果没有单元测试,几乎不能保证代码质量。

    4.依赖很多又很复杂(右上)

    这种代码显然是单元测试的噩梦。写单元测试吧,代价高昂;不写单元测试吧,风险太高。像这种代码我们尽量在设计上将其分为两部分:1.处理复杂的逻辑部分 2.处理依赖部分
    然后1部分进行单元测试

    原文参考:http://blog.stevensanderson.com/2009/11/04/selective-unit-testing-costs-and-benefits/

    迈出单元测试第一步

    1. 识别依赖,抽象成接口

    识别系统中的外部依赖,普遍来说,我们遇到最常见的依赖无非下面几种:

    1. 网络依赖——函数执行依赖于网络请求,比如第三方http-api,rpc服务,消息队列等等
    2. 数据库依赖
    3. I/O依赖(文件)

    当然,还有可能是依赖还未开发完成的功能模块。但是处理方法都是大同小异的——抽象成接口,通过mock和stub进行模拟测试。

    2. 明确需要测什么

    当我们开始敲产品代码的时候,我们必然已经过初步的设计,已经了解系统中的外部依赖以及业务复杂的部分,这些部分是要优先考虑写单元测试的。在写每一个方法/结构体的时候同时思考这个方法/结构体需不需要测试?如何测试?对于什么样的方法/结构体需要测试,什么样的可以不做,除了可以从上面的成本/价值象限图中获得答案外,还可以参考以下关于单元测试粒度要做多细问题的回答:

    老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的标准,当然,这种自信也可能是种自大)。如果我的编码生涯中不会犯这种典型的错误(如:在构造函数中设了个错误的值),那我就不会测试它。我倾向于去对那些有意义的错误做测试,所以,我对一些比较复杂的条件逻辑会异常地小心。当在一个团队中,我会非常小心的测试那些会让团队容易出错的代码
    https://coolshell.cn/articles/8209.html

    Mock和Stub怎么做

    Mock(模拟)和Stub(桩)是在测试过程中,模拟外部依赖行为的两种常用的技术手段。
    通过Mock和Stub我们不仅可以让测试环境没有外部依赖,而且还可以模拟一些异常行为,如数据库服务不可用,没有文件的访问权限等等。

    Mock和Stub的区别

    在Go语言中,可以这样描述Mock和Stub:

    • Mock:在测试包中创建一个结构体,满足某个外部依赖的接口interface{}
    • Stub:在测试包中创建一个模拟方法,用于替换生成代码中的方法

    还是有点抽象,下面举例说明。

    Mock示例

    Mock:在测试包中创建一个结构体,满足某个外部依赖的接口interface{}

    生产代码:

    //auth.go
    //假设我们有一个依赖http请求的鉴权接口
    type AuthService interface{
    	Login(username string,password string) (token string,e error)
    	Logout(token string) error
    }
    

    mock代码:

    //auth_test.go
    type authService struct {
    }
    func (auth *authService) Login (username string,password string) (string,error) {
    	return "token", nil
    }
    func (auth *authService) Logout(token string) error{
    	return nil
    }
    

    在这里我们用authService实现了AuthService接口,这样测试Login,Logout就不再需需要依赖网络请求了。而且我们也可以模拟一些错误的情况进行测试:

    //auth_test.go
    //模拟登录失败
    type authLoginErr struct {
    	auth AuthService  //可以使用组合的特性,Logout方法我们不关心,只用“覆盖”Login方法即可
    }
    func (auth *authLoginErr) Login (username string,password string) (string,error) {
    	return "", errors.New("用户名密码错误")
    }
    
    //模拟api服务器宕机
    type authUnavailableErr struct {
    }
    func (auth *authLoginErr) Login (username string,password string) (string,error) {
    	return "", errors.New("api服务不可用")
    }
    func (auth *authLoginErr) Logout(token string) error{
    	return errors.New("api服务不可用")
    }
    

    Stub示例

    Stub:在测试包中创建一个模拟方法,用于替换生成代码中的方法。
    这是《Go语言圣经》(11.2.3)当中的一个例子:
    生产代码:

    //storage.go
    //发送邮件
    var notifyUser = func(username, msg string) { //<--将发送邮件的方法变成一个全局变量
        auth := smtp.PlainAuth("", sender, password, hostname)
        err := smtp.SendMail(hostname+":587", auth, sender,
            []string{username}, []byte(msg))
        if err != nil {
            log.Printf("smtp.SendEmail(%s) failed: %s", username, err)
        }
    }
    //检查quota,quota不足将发邮件
    func CheckQuota(username string) {
        used := bytesInUse(username)
        const quota = 1000000000 // 1GB
        percent := 100 * used / quota
        if percent < 90 {
            return // OK
        }
        msg := fmt.Sprintf(template, used, percent)
        notifyUser(username, msg) //<---发邮件
    }
    

    显然,在跑单元测试的过程中,我们肯定不会真的给用户发邮件。在书中采用了stub的方式来进行测试:

    //storage_test.go
    func TestCheckQuotaNotifiesUser(t *testing.T) {
        var notifiedUser, notifiedMsg string
        notifyUser = func(user, msg string) {  //<-看这里就够了,在测试中,覆盖了发送邮件的全局变量
            notifiedUser, notifiedMsg = user, msg
        }
    
        // ...simulate a 980MB-used condition...
    
        const user = "joe@example.org"
        CheckQuota(user)
        if notifiedUser == "" && notifiedMsg == "" {
            t.Fatalf("notifyUser not called")
        }
        if notifiedUser != user {
            t.Errorf("wrong user (%s) notified, want %s",
                notifiedUser, user)
        }
        const wantSubstring = "98% of your quota"
        if !strings.Contains(notifiedMsg, wantSubstring) {
            t.Errorf("unexpected notification message <<%s>>, "+
                "want substring %q", notifiedMsg, wantSubstring)
        }
    }
    

    可以看到,在Go中,如果要用stub,那将是侵入式的,必须将生产代码设计成可以用stub方法替换的形式。上述例子体现出来的结果就是:为了测试,专门用一个全局变量notifyUser来保存了具有外部依赖的方法。然而在不提倡使用全局变量的Go语言当中,这显然是不合适的。所以,并不提倡这种Stub方式。

    Mock与Stub相结合

    既然不提倡Stub方式,那是不是在Go测试当中就可以抛弃Stub了呢?原本我是这么认为的,但直到我读了这篇译文Golang 标准包布局[译],虽然这篇译文讲的是包的布局,但里面的测试示例很值得学习。

    //生产代码 myapp.go
    package myapp
    
    type User struct {
        ID      int
        Name    string
        Address Address
    }
    //User的一些增删改查
    type UserService interface {
        User(id int) (*User, error)
        Users() ([]*User, error)
        CreateUser(u *User) error
        DeleteUser(id int) error
    }
    

    常规Mock方式:

    //测试代码 myapp_test.go
    type userService struct{
    }
    func (u* userService) User(id int) (*User,error) {
    	return &User{Id:1,Name:"name",Address:"address"},nil
    }
    //..省略其他实现方法
    
    //模拟user不存在
    type userNotFound struct {
    	u UserService
    }
    func (u* userNotFound) User(id int) (*User,error) {
    	return nil,errors.New("not found")
    }
    
    //其他...
    

    一般来说,mock结构体内部很少会放变量,针对每一个要模拟的场景(比如上面的user不存在),最政治正确的方法应该是新建一个mock结构体。这样有两个好处:

    1. mock出来的结构体十分简单,不需要进行额外的设置,不容易出错。
    2. mock出来的结构体职责单一,测试代码自说明能力更强,可读性更高。

    但在刚才提到的文章中,他是这么做的:

    //测试代码
    // UserService 代表一个myapp.UserService.的 mock实现 
    type UserService struct {
        UserFn      func(id int) (*myapp.User, error)
        UserInvoked bool
    
        UsersFn     func() ([]*myapp.User, error)
        UsersInvoked bool
    
        // 其他接口方法补全..
    }
    
    // User调用mock实现, 并标记这个方法为已调用
    func (s *UserService) User(id int) (*myapp.User, error) {
        s.UserInvoked = true
        return s.UserFn(id)
    }
    

    这里不仅实现了接口,还通过在结构体内放置与接口方法函数签名一致的方法(UserFn UsersFn ...),以及XxxInvoked是否调用标识符来追踪方法的调用情况。这种做法其实将mock与stub相结合了起来:在mock对象的内部放置了可以被测试函数替换的函数变量UserFn UsersFn…)。我们可以在我们的测试函数中,根据测试的需要,手动更换函数实现:

    //mock与stub结合的方式
    func TestUserNotFound(t *testing.T) {
    	userNotFound := &UserService{}
    	userNotFound.UserFn = func(id int) (*myapp.User, error) { //<---自己实现UserFn的实现
    		return nil,errors.New("not found")
    	}
    	//后续业务测试代码...
    	
    	if !userNotFound.UserInvoked {
    		t.Fatal("没有调用User()方法")
    	}
    }
    
    //传统的mock方式
    func TestUserNotFound(t *testing.T) {
    	userNotFound := &userNotFound{} //<---结构体方法已经决定了返回值
    	//后续业务测试代码
    }
    

    通过将mock与stub结合,不仅能在测试方法中动态的更改实现,还追踪方法的调用情况,上述例子中只是追踪了方法是否被调用,实际中,如果有需要,我们也可以追踪方法的调用次数,甚至是方法的调用顺序:

    type UserService struct {
        UserFn      func(id int) (*myapp.User, error)
        UserInvoked bool
        UserInvokedTime int //<--追踪调用次数
        
    
        UsersFn     func() ([]*myapp.User, error)
        UsersInvoked bool
    
        // 其他接口方法补全..
    	
    	FnCallStack []string //<---函数名slice,追踪调用顺序
    }
    
    // User调用mock实现, 并标记这个方法为已调用
    func (s *UserService) User(id int) (*myapp.User, error) {
        s.UserInvoked = true
        s.UserInvokedTime++ //<--调用发次数
    	s.FnCallStack = append(s.FnCallStack,"User") //调用顺序
        return s.UserFn(id)
    }
    

    但同时,我们也会发现我们的mock结构体更复杂了,维护成本也随之增加了。两种mock风格各有各的好处,反正要记得软件工程没有银弹,合适的场景选用合适的方法就行了。
    但总体而言,mock与stub相结合的这种方式的确是一种不错的测试思路,尤其是当我们需要追踪函数是否调用,调用次数,调用顺序等信息时,mock+stub将是我们的不二选择。举个例子:

    //缓存依赖
    type Cache interface{
    	Get(id int) interface{} //获取某id的缓存 
    	Put(id int,obj interface{}) //放入缓存
    }
    
    //数据库依赖
    type UserRepository interface{
    	//....
    }
    //User结构体
    type User struct {
    	//...
    }
    //userservice
    type UserService interface{
    	cache Cache 
    	repository UserRepository
    }
    
    func (u *UserService) Get(id int) *User {
    	//先从缓存找,缓存找不到在去repository里面找
    }
    
    func main() {   
    	userService := NewUserService(xxx) //注入一些外部依赖
    	user := userService.Get(2) //获取id = 2的user
    }
    

    现在要测试userService.Get(id)方法的行为:

    1. Cache命中之后是否还查数据库?(不应该再查了)
    2. Cache未命中的情况下是否会查库?

    这种测试通过mock+stub结合做起来将会非常方便,作为小练习,可以尝试自己实现一下。

    展开全文
  • 牛客网编程答题测试技巧

    千次阅读 2019-08-18 10:27:15
    输入 1.预先不知到数据的组数用while #include <iostream> using namespace std; int main() { int a,b; while(cin>>a>>b) { cout<<a+b<<endl; } ...2.预先...
  • SAP 测试技巧

    千次阅读 2010-08-19 21:03:00
    在一些项目中,客户要求写完整的文档,令人烦的就是贴图,将测试点结果截图下来以方便顾问查看。 今天遇到几个问题,不管有无用处,下面将解决办法分享一下。 1、遇到一个更改采购订单凭证的BAPI,要求测试BAPI...
  • 经常听到一些测试同学抱怨,每天忙于业务测试,无法接触核心技术,面试时只能讲一些业务流程相关的东西,很难引起面试官的兴趣。甚至有些悲观的同学认为,测试就是枯燥的“鼠标点点点...
  • 可以让同学门了解有管软件测试方面的知识,以及一些测试时候需要注意的方面。
  • USB设备的调试与测试技巧.pdf,USB设备的调试与测试技巧.pdf
  • 自动化测试技巧之结果验证

    千次阅读 2018-06-21 15:32:50
    转载:原文出处点击打开链接自动化测试技巧之结果验证 自动到了京城,已经两月没有好好整理下自己的思路了,也没有好好的写一些东西了。现在,真应该回归了。因为有的东西,不吐不快。 --------------------------...
  • 微信小程序测试过程中的各个要点(干货)

    千次阅读 多人点赞 2019-09-10 15:51:20
    单纯功能测试的层面来说,微信小程序测试、APP测试、web测试在流程和功能测试上是没有区别的,但由于载体的不同,导致有一些不同,主要可以从几个方面体现: 1、系统架构方面 2、性能方面 3、兼容方面 4、测试工具...
  • iOSAPP开发FPS的测试技巧

    千次阅读 2018-01-20 13:20:16
    我们知道iOS设备的刷新率基本都是60FPS(PS:去年出的ipad pro刷新率是120).所以iOS的APP用起来一般都不会感觉到卡顿的情况.除非你UI的某些地方写的有问题导致严重掉帧.但是,我们如何来看FPS的数值呢. ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 285,566
精华内容 114,226
关键字:

测试技巧