51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

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

[转贴] 文件上传的单元测试怎么写?

[复制链接]
  • TA的每日心情
    擦汗
    5 天前
  • 签到天数: 1027 天

    连续签到: 2 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-6-17 09:16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    有个群友问了一个不错的问题:文件上传的单元测试怎么写?后面也针对后端开发要不要学一下单元测试的话题聊了聊,个人是非常建议后端开发能够学一下单元测试的。所以,今天特地拿出来写一篇说说,并不是因为这有多难写,而是作为出色的后端开发人员,单元测试如果你能考虑周到,那么从代码结构,程序质量上都会有很大的提升。而实际开发过程中,很少有开发人员会特别关注这个方面。
      言归正传,下面我们具体说说当碰到需要上传文件的接口,我们要如何写单元测试!
      先来回忆一下,普通接口的单元测试我们是如何写的?看看我们入门例子中的单元测试:
      @SpringBootTest
      public class Chapter11ApplicationTests {
          private MockMvc mvc;
          @Before
          public void setUp() {
              mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
          }
          @Test
          public void getHello() throws Exception {
              mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
                      .andExpect(status().isOk())
                      .andExpect(content().string(equalTo("Hello World")));
          }
      }

      这里我们所用到的核心是MockMvc工具,通过模拟http请求的提交并指定相关的期望返回来完成。
      对于文件上传接口,本质上还是http请求的处理,所以MockMvc依然逃不掉,就是上传内容发生了改变,我们只需要去找一下文件上传的模拟对象是哪个,就可以轻松完成这个任务。
      具体写法如下:
      @SpringBootTest(classes = Chapter43Application.class)
      public class FileTest {
          @Autowired
          protected WebApplicationContext context;
          protected MockMvc mvc;
          @BeforeEach
          public void setUp() {
              mvc = MockMvcBuilders.webAppContextSetup(context).build();
          }
          @Test
          public void uploadFile() throws Exception {
              MockMultipartFile file = new MockMultipartFile(
                      "file",
                      "hello.txt",
                      MediaType.TEXT_PLAIN_VALUE,
                      "Hello, World!".getBytes()
              );
              final MvcResult result = mvc.perform(
                      MockMvcRequestBuilders
                              .multipart("/upload")
                              .file(file))
                      .andDo(print())
                      .andExpect(status().isOk())
                      .andReturn();
          }
      }

      可以看到MockMvc的测试主体是不变的,无非就是请求类型和请求内容发生了改变。
      是否会编写单元测试以及能否写好单元测试,是很难看出一个后端开发水平的。所以,我是非常推荐大家能够在编写业务实现的时候,先考虑一下自己的单元测试是否方便写,甚至先定义好接口,并写好单元测试,再去写实现(传说中的测试驱动开发)。
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2021-6-21 16:35:13 | 只看该作者
    这是个java代码吧
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-10-5 07:25 , Processed in 0.075305 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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