Java-测试框架-齐聚一堂

测试框架-齐聚一堂

JUnit

Unit

单元测试

  • @Test

测试方法

a)(expected=XXException.class)如果程序的异常和XXException.class一样,则测试通过

b)(timeout=100)如果程序的执行能在100毫秒之内完成,则测试通过

  • @Ignore

被忽略的测试方法:加上之后,暂时不运行此段代码

  • @Before

每一个测试方法之前运行

  • @After

每一个测试方法之后运行

  • @BeforeClass

方法必须必须要是静态方法(static 声明),所有测试开始之前运行,注意区分before,是所有测试方法

  • @AfterClass

方法必须要是静态方法(static 声明),所有测试结束之后运行,注意区分- @After

Spring With JUnit

依赖

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency> 

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <scope>provided</scope>
</dependency>
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration(locations={"classpath:applicationContext.xml"}) //加载配置文件 
//------------如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,在测试类的方法上///控制事务,参见下一个实例  
//这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!  
//@Transactional  
//这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时//指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!  
//@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
//------------  
public class BaseJunit4Test{

}

Spring Boot

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class SomeServiceTest {

    

}

Webmvc With JUnit

@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
@WebAppConfiguration
public class SomeControllerTest {
    @Autowired
    private WebApplicationContext context;
    private MockMvc mvc;
    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.webAppContextSetup(context).build();//建议使用这种
    }
    @Test
    public void test() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/some")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                    .param("name", "Percy")
                    .param("lon", "456.456")
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("Hello World: Percy")));
    }
}

Spock

Spock With Spring
@ContextConfiguration(classes = BootTestApplication)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@ActiveProfiles("test")
class SomeServiceSpec extends Specification{
    private Logger log = LoggerFactory.getLogger(this.getClass());
    @Autowired
    SomeService someService
    def "test autowired"() {
        when:
        String result = someService.handle("123")
        log.info("==============={}", result)
        then:
        someService != null
    }
}
Features

基于Groovy的Spock框架

摘要

Spock是一个用于Java或者Groovy程序的测试框架。利用Groovy的语言特性,Spock可以更加快速的编写单元测试,也可以使单元测试更加清晰、简洁。更详细的介绍以及用法可以在官方文档上看到,下面进行一些简单的介绍和实例演示

内置预定义方法

  • setup()

相当于@Before

  • cleanup()

相当于@After

  • setupSpec()

相当于@BeforeClass

  • cleanupSpec()

相当于@AfterClass

  • when

在这个块中调用要测试的方法

  • then

when与then需要搭配使用,在when中执行待测试的函数,在then中判断是否符合预期

  • expect:

一般跟在setup块后使用,包含一些assert语句,检查在setup块中准备好的测试环境

  • where

做测试时最复杂的事情之一就是准备测试数据,尤其是要测试边界条件、测试异常分支等,这些都需要在测试之前规划好数据。

  • clearup

主要做一些清理工作,例如关闭资源连接等。

  • given

given相当于setup, 在方法内使用

def setup() {} // run before every feature method 
def cleanup() {} // run after every feature method 
def setupSpec() {} // run before the first feature method 
def cleanupSpec() {} // run after the last feature method 

注解讲解

  • @Title(“测试的标题”)

测试的标题

  • @Title(“测试的标题”)

  • @Stepwise

当测试方法间存在依赖关系时,标明测试方法将严格按照其在源代码中声明的顺序执行

  • @Stepwise

  • @Subject

标明被测试的类是Adder

  • @Subject(Adder) //标明被测试的类是Adder

  • @Narrative

关于测试的大段文本描述

  • @Narrative(""“关于测试的大段文本描述”"")

  • @Unroll

where块中的每行参数都转换为一个独立的测试用例

  • @Unroll(“test #para0, #para1”)
阶段

概念上,测试方法包含4个阶段

基本设置

执行语句

测试结果

清理设置

示例

依赖级联测试
def "依赖级联测试"() {
    setup:
    UserRepo userRepo =  Mock(UserRepo);
    User user = new User();
    user.with {
        id = 123
        name = 'SomeOne'
    }

    FeatureService featureService = new FeatureService()
    featureService.userRepo = userRepo
    1 * userRepo.get(123) >> user

    when:
    User result = featureService.findOne(123)
    then:
    result == user
}
参数化测试
/**
 *  使用when-then进行参数化测试
 *
 *
 *
 */
def "参数化测试"() {
    when:
    FeatureService featureService = new FeatureService()

    then:
    featureService.add(a, b) == sum

    where:
    a   |   b   |  sum
    1   |   2   |  3
    1   |   3   |  4
}
模拟异常
def "模拟异常"() {
    given:
    FeatureService featureService = Mock(FeatureService)
    and:
    featureService.findOne(1) >> {
        throw new RuntimeException("哈哈,中计了")
    }
    when: "踩坑"
    featureService.findOne(1)
    then: "validator"
    RuntimeException runtimeException = thrown(RuntimeException)
    runtimeException.message == "哈哈,中计了"
}

Mockito

主要是Mock模拟对象,进行相关测试,如果测试私有方法和静态方法一般结合powermock与mockito使用。

Powermock

与mockito结合使用

Selenium

主要是模拟浏览器行为,可以进行录制

源码参考地址:

https://github.com/Percy0601/boot-features/tree/master/boot-features-test

vue-code-diff是一个用于在Vue项目中显示代码差异的插件。当vue-code-diff不对齐时,可能有以下几个原因和解决方法: 1. 插件版本不兼容:首先要确保vue-code-diff插件的版本与Vue项目的版本兼容。可以通过查看vue-code-diff的文档或者安装最新版本的插件来解决这个问题。 2. 样式冲突:vue-code-diff的展示需要一定的样式支持,可能存在与项目中其他样式库或自定义样式发生冲突的情况。可以通过使用scoped样式、更改样式命名空间或重新设计样式来解决这个问题。 3. 代码格式问题:如果代码在Vue组件中使用了不同的缩进或对齐方式,vue-code-diff可能会出现不对齐的情况。在这种情况下,需统一代码的缩进和对齐方式,确保比对的代码结构一致。 4. 数据源问题:vue-code-diff的对比结果是基于提供的数据源进行展示的。如果数据源不正确或者解析出现问题,将导致代码不对齐。检查数据源的正确性,并确保数据用于生成代码差异的函数正确返回对应的数据。 5. 其他问题:如果以上方法都没有解决vue-code-diff不对齐的问题,那可能是插件本身的bug或者其他未知的原因。可以尝试在插件的GitHub页面上提交issue,或者尝试寻找其他的代码对比插件替代解决。 总之,对于vue-code-diff不对齐的问题,需要根据具体情况进行分析和排查,找出具体原因并采取相应的解决方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值