51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4508|回复: 1
打印 上一主题 下一主题

[转贴] 终于有机会使用一次单元测试了

[复制链接]
  • TA的每日心情
    无聊
    9 小时前
  • 签到天数: 1052 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-6-17 09:15:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    我想很多人都有像我一样的疑惑,似乎前端项目这么多,页面功能这么复杂,不可能每个组件都测试到,因为组件本身也挺复杂的。直到我最近写了一个全局组件,里面最主要的功能就是限制input框输入合法的文本,检测方式就是用正则RegExp.test是否匹配,为了方便这个组件本身按照项目中最常见的输入规范安排了正则的默认值,因为这个是个全局组件,我担心正则的匹配会有问题,所以想到了或许这么一个小功能可以用单元测试来测(组件还有其他功能,但我的单元测试只会关注这一个)这样看起来,单元测试也不会复杂到让人难以下手。
      组件是这样的
      代码如下,省略了无关逻辑:
      <template>
        <div class="popoverinput">
          <el-tooltip :content="content" :disabled="!getErrorClass($attrs.value)">
            <el-input
              v-bind="$attrs"
              v-on="$listeners"
              :class="getErrorClass($attrs.value)"
            ></el-input>
          </el-tooltip>
        </div>
      </template>
      <script>
      export default {
        name: 'PopoverInput',
        inheritAttrs: false, //这里设置为false是为了el-input这个组件内部的子组件能够继承非props和listener传进来的值
        props: {
          content: {
            type: String,
            default: '输入不合法',
          },
          reg: {
            type: RegExp,
            default: () => /^(([1-9]\d?)|0)(\.\d{1,2})?$|^100(\.0{1,2})?$/,
          },
        },
        methods: {
          getErrorClass(v) {
            let r = !this.reg.test(v);
            return r ? 'errflag' : '';
          },
        },
      };
      </script>


      使用是这样使用的:
      <PopoverInput content="你想要的提示语" v-model="scope.row.name"></PopoverInput>

      这个组件主要要确认两件事情,
      1.在某个范围内的数值是有效的。
      2.不正确的时候input框有对应的class:'errflag'。
      按照上面的判断标准可以写出测试用例
      1.首先在目录 '你的项目名称tests\unit'文件夹加入以后缀名为.spec.js的js文件。例如我的就叫popoverInput.spec.js,叫什么名字不重要,我主要是对应要测试的组件而已。
      2.然后去到vue-test-utils看看vue提供给单元测试的框架文档?
      3.然后就可以看看下面的例子了。
      import { expect } from 'chai';
      import { mount } from '@vue/test-utils';
      import PopoverInput from '@/components/PopoverInput.vue';
      describe('PopoverInput.vue', async () => {
        it('test input valid', async () => {
          const compo = mount(PopoverInput);
          for (let i = -200; i <= 200; i = i + 0.001) {
            let value = i;
            await compo.setProps({ value: value });
            let err = await compo.find('el-input').classes();
            let str = String(value);
            let len = str.split('').filter((item) => item === '.').length;
            let decimalLen = str.indexOf('.') > -1 && str.split('.')[1].length;
            let ind = str.indexOf('.');
            if (
              value >= 0 &&
              value <= 100 &&
              len <= 2 &&
              (ind === -1 || (ind > -1 && decimalLen > 0 && decimalLen <= 2))
            )
              expect(err).not.to.has.members(['errflag']);
            else expect(err).to.has.members(['errflag']);
          }
        });
      });


      mount,setPros,find,.classes都是vue-test-utils框架提供的方法。
      上面的for循环就是一个个检测这些数值不符合要求的时候,class为'el-input'的组件会加上"errFlag"这个类。
      (ps这些测试用例肯定不够的,真实场景中还有其他用例)
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-9 14:08
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2021-6-21 16:35:25 | 只看该作者
    单元测试显得高大上一些
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-27 19:05 , Processed in 0.068664 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表