范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

TDD测试驱动开发(结合需求一步步实现)

  Test-driven development
  主要是通过不断循环以下两个小步骤将需求一步步实现:在写新代码之前先写好执行失败的测试用例再写最少的代码实现使用前一步的新用例执行成功
  实际上是这种开发循环[test, code, refactor, (repeat)
  TDD 三大优点:实现的代码都是为了实现需求逻辑的写出的代码都是经过测试的,没有BUG的测试方法可以作为文档,通过测试代码很容易理解代码解决的问题
  通过下面的需求实现过程说明TDD的开发过程
  航班添加乘客业务逻辑:经济航班可以加任何类型乘客,商业航班只加VIP乘客
  移除乘客逻辑:可以任意移除普通乘客,不允许移除VIP乘客
  第一版设计
  Fight类import java.util.ArrayList; import java.util.Collections; import java.util.List;  public class Flight {      private String id;     private List passengers = new ArrayList();     private String flightType;      public Flight(String id, String flightType) {         this.id = id;         this.flightType = flightType;     }      public String getId() {         return id;     }      public List getPassengersList() {         return Collections.unmodifiableList(passengers);     }      public String getFlightType() {         return flightType;     }      public boolean addPassenger(Passenger passenger) {         switch (flightType) {             case "Economy":                 return passengers.add(passenger);             case "Business":                 if (passenger.isVip()) {                     return passengers.add(passenger);                 }                 return false;             default:                 throw new RuntimeException("Unknown type: " + flightType);         }      }      public boolean removePassenger(Passenger passenger) {         switch (flightType) {             case "Economy":                 if (!passenger.isVip()) {                     return passengers.remove(passenger);                 }                 return false;             case "Business":                 return false;             default:                 throw new RuntimeException("Unknown type: " + flightType);         }     }  }
  Passenger类public class Passenger {      private String name;     private boolean vip;      public Passenger(String name, boolean vip) {         this.name = name;         this.vip = vip;     }      public String getName() {         return name;     }      public boolean isVip() {         return vip;     }  }
  通过Airport的main方法测试public class Airport {      public static void main(String[] args) {         Flight economyFlight = new Flight("1", "Economy");         Flight businessFlight = new Flight("2", "Business");          Passenger james = new Passenger("James", true);         Passenger mike = new Passenger("Mike", false);          businessFlight.addPassenger(james);         businessFlight.removePassenger(james);         businessFlight.addPassenger(mike);         economyFlight.addPassenger(mike);          System.out.println("Business flight passengers list:");         for (Passenger passenger : businessFlight.getPassengersList()) {             System.out.println(passenger.getName());         }          System.out.println("Economy flight passengers list:");         for (Passenger passenger : economyFlight.getPassengersList()) {             System.out.println(passenger.getName());         }     } }
  改成TDD方式测试
  引入Junit5                      org.junit.jupiter             junit-jupiter-api             5.6.0             test                               org.junit.jupiter             junit-jupiter-engine             5.6.0             test              
  AirportTestimport org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test;  import static org.junit.jupiter.api.Assertions.assertEquals;  public class AirportTest {      @DisplayName("Given there is an economy flight")     @Nested     class EconomyFlightTest {          private Flight economyFlight;          @BeforeEach         void setUp() {             economyFlight = new Flight("1", "Economy");         }          @Test         public void testEconomyFlightRegularPassenger() {             Passenger mike = new Passenger("Mike", false);              assertEquals("1", economyFlight.getId());             assertEquals(true, economyFlight.addPassenger(mike));             assertEquals(1, economyFlight.getPassengersList().size());             assertEquals("Mike", economyFlight.getPassengersList().get(0).getName());              assertEquals(true, economyFlight.removePassenger(mike));             assertEquals(0, economyFlight.getPassengersList().size());         }          @Test         public void testEconomyFlightVipPassenger() {             Passenger james = new Passenger("James", true);              assertEquals("1", economyFlight.getId());             assertEquals(true, economyFlight.addPassenger(james));             assertEquals(1, economyFlight.getPassengersList().size());             assertEquals("James", economyFlight.getPassengersList().get(0).getName());              assertEquals(false, economyFlight.removePassenger(james));             assertEquals(1, economyFlight.getPassengersList().size());         }     }      @DisplayName("Given there is a business flight")     @Nested     class BusinessFlightTest {         private Flight businessFlight;          @BeforeEach         void setUp() {             businessFlight = new Flight("2", "Business");         }          @Test         public void testBusinessFlightRegularPassenger() {             Passenger mike = new Passenger("Mike", false);              assertEquals(false, businessFlight.addPassenger(mike));             assertEquals(0, businessFlight.getPassengersList().size());             assertEquals(false, businessFlight.removePassenger(mike));             assertEquals(0, businessFlight.getPassengersList().size());          }          @Test         public void testBusinessFlightVipPassenger() {             Passenger james = new Passenger("James", true);              assertEquals(true, businessFlight.addPassenger(james));             assertEquals(1, businessFlight.getPassengersList().size());             assertEquals(false, businessFlight.removePassenger(james));             assertEquals(1, businessFlight.getPassengersList().size());          }     } }
  执行测试用例后发现Airport类没使用到,可以去掉。
  Fight覆盖率小于100%,发现getFlightType没使用到,switch块的default case没覆盖,考虑重构移除未使用的代码。
  开始着手重构事宜:
  可以通过多态代替switch条件,利用多态特性(运行时而非编译时才确定实际调用具体的方法),使得开发的代码符合**开闭原则,**避免每次增加航班类型都要修改存在的类。
  第二版设计
  Flightimport java.util.ArrayList; import java.util.Collections; import java.util.List;  public abstract class Flight {      private String id;     List passengers = new ArrayList();      public Flight(String id) {         this.id = id;     }      public String getId() {         return id;     }      public List getPassengers() {         return Collections.unmodifiableList(passengers);     }      public abstract boolean addPassenger(Passenger passenger);      public abstract boolean removePassenger(Passenger passenger);  }
  EconomyFlightpublic class EconomyFlight extends Flight {      public EconomyFlight(String id) {         super(id);     }      @Override     public boolean addPassenger(Passenger passenger) {         return passengers.add(passenger);     }      @Override     public boolean removePassenger(Passenger passenger) {         if (!passenger.isVip()) {             return passengers.remove(passenger);         }         return false;     }  }
  BusinessFlightpublic class BusinessFlight extends Flight {      public BusinessFlight(String id) {         super(id);     }      @Override     public boolean addPassenger(Passenger passenger) {         if (passenger.isVip()) {             return passengers.add(passenger);         }         return false;     }      @Override     public boolean removePassenger(Passenger passenger) {         return false;     }  }
  AirportTestimport org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test;  import static org.junit.jupiter.api.Assertions.assertEquals;  public class AirportTest {      @DisplayName("Given there is an economy flight")     @Nested     class EconomyFlightTest {          private Flight economyFlight;          @BeforeEach         void setUp() {             economyFlight = new EconomyFlight("1");         }          @Test         public void testEconomyFlightRegularPassenger() {             Passenger mike = new Passenger("Mike", false);              assertEquals("1", economyFlight.getId());             assertEquals(true, economyFlight.addPassenger(mike));             assertEquals(1, economyFlight.getPassengers().size());             assertEquals("Mike", economyFlight.getPassengers().get(0).getName());              assertEquals(true, economyFlight.removePassenger(mike));             assertEquals(0, economyFlight.getPassengers().size());         }          @Test         public void testEconomyFlightVipPassenger() {             Passenger james = new Passenger("James", true);              assertEquals("1", economyFlight.getId());             assertEquals(true, economyFlight.addPassenger(james));             assertEquals(1, economyFlight.getPassengers().size());             assertEquals("James", economyFlight.getPassengers().get(0).getName());              assertEquals(false, economyFlight.removePassenger(james));             assertEquals(1, economyFlight.getPassengers().size());         }      }      @DisplayName("Given there is a business flight")     @Nested     class BusinessFlightTest {         private Flight businessFlight;          @BeforeEach         void setUp() {             businessFlight = new BusinessFlight("2");         }          @Test         public void testBusinessFlightRegularPassenger() {             Passenger mike = new Passenger("Mike", false);              assertEquals(false, businessFlight.addPassenger(mike));             assertEquals(0, businessFlight.getPassengers().size());             assertEquals(false, businessFlight.removePassenger(mike));             assertEquals(0, businessFlight.getPassengers().size());          }          @Test         public void testBusinessFlightVipPassenger() {             Passenger james = new Passenger("James", true);              assertEquals(true, businessFlight.addPassenger(james));             assertEquals(1, businessFlight.getPassengers().size());             assertEquals(false, businessFlight.removePassenger(james));             assertEquals(1, businessFlight.getPassengers().size());          }      }  }
  来了新需求,增加一种新类型航班:只允许VIP乘客乘坐,其他类型乘客不允许乘坐;可以移除任何类型的乘客。
  先实现简单的PremiumFlightpublic class PremiumFlight extends Flight {      public PremiumFlight(String id) {         super(id);     }      @Override     public boolean addPassenger(Passenger passenger) {                  return false;     }      @Override     public boolean removePassenger(Passenger passenger) {                  return false;     }  }
  AirportTestimport org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test;  import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals;  public class AirportTest {      @DisplayName("Given there is an economy flight")     @Nested     class EconomyFlightTest {          private Flight economyFlight;         private Passenger mike;         private Passenger james;          @BeforeEach         void setUp() {             economyFlight = new EconomyFlight("1");             mike = new Passenger("Mike", false);             james = new Passenger("James", true);         }          @Nested         @DisplayName("When we have a regular passenger")         class RegularPassenger {              @Test             @DisplayName("Then you can add and remove him from an economy flight")             public void testEconomyFlightRegularPassenger() {                 assertAll("Verify all conditions for a regular passenger and an economy flight",                         () -> assertEquals("1", economyFlight.getId()),                         () -> assertEquals(true, economyFlight.addPassenger(mike)),                         () -> assertEquals(1, economyFlight.getPassengersList().size()),                         () -> assertEquals("Mike", economyFlight.getPassengersList().get(0).getName()),                         () -> assertEquals(true, economyFlight.removePassenger(mike)),                         () -> assertEquals(0, economyFlight.getPassengersList().size())                 );             }         }          @Nested         @DisplayName("When we have a VIP passenger")         class VipPassenger {             @Test             @DisplayName("Then you can add him but cannot remove him from an economy flight")             public void testEconomyFlightVipPassenger() {                 assertAll("Verify all conditions for a VIP passenger and an economy flight",                         () -> assertEquals("1", economyFlight.getId()),                         () -> assertEquals(true, economyFlight.addPassenger(james)),                         () -> assertEquals(1, economyFlight.getPassengersList().size()),                         () -> assertEquals("James", economyFlight.getPassengersList().get(0).getName()),                         () -> assertEquals(false, economyFlight.removePassenger(james)),                         () -> assertEquals(1, economyFlight.getPassengersList().size())                 );              }         }     }      @DisplayName("Given there is a business flight")     @Nested     class BusinessFlightTest {         private Flight businessFlight;         private Passenger mike;         private Passenger james;          @BeforeEach         void setUp() {             businessFlight = new BusinessFlight("2");             mike = new Passenger("Mike", false);             james = new Passenger("James", true);         }          @Nested         @DisplayName("When we have a regular passenger")         class RegularPassenger {              @Test             @DisplayName("Then you cannot add or remove him from a business flight")             public void testBusinessFlightRegularPassenger() {                 assertAll("Verify all conditions for a regular passenger and a business flight",                         () -> assertEquals(false, businessFlight.addPassenger(mike)),                         () -> assertEquals(0, businessFlight.getPassengersList().size()),                         () -> assertEquals(false, businessFlight.removePassenger(mike)),                         () -> assertEquals(0, businessFlight.getPassengersList().size())                 );             }         }          @Nested         @DisplayName("When we have a VIP passenger")         class VipPassenger {              @Test             @DisplayName("Then you can add him but cannot remove him from a business flight")             public void testBusinessFlightVipPassenger() {                 assertAll("Verify all conditions for a VIP passenger and a business flight",                         () -> assertEquals(true, businessFlight.addPassenger(james)),                         () -> assertEquals(1, businessFlight.getPassengersList().size()),                         () -> assertEquals(false, businessFlight.removePassenger(james)),                         () -> assertEquals(1, businessFlight.getPassengersList().size())                 );             }         }     }      @DisplayName("Given there is a premium flight")     @Nested     class PremiumFlightTest {         private Flight premiumFlight;         private Passenger mike;         private Passenger james;          @BeforeEach         void setUp() {             premiumFlight = new PremiumFlight("3");             mike = new Passenger("Mike", false);             james = new Passenger("James", true);         }          @Nested         @DisplayName("When we have a regular passenger")         class RegularPassenger {              @Test             @DisplayName("Then you cannot add or remove him from a premium flight")             public void testPremiumFlightRegularPassenger() {                 assertAll("Verify all conditions for a regular passenger and a premium flight",                         () -> assertEquals(false, premiumFlight.addPassenger(mike)),                         () -> assertEquals(0, premiumFlight.getPassengersList().size()),                         () -> assertEquals(false, premiumFlight.removePassenger(mike)),                         () -> assertEquals(0, premiumFlight.getPassengersList().size())                 );             }         }          @Nested         @DisplayName("When we have a VIP passenger")         class VipPassenger {              @Test             @DisplayName("Then you can add and remove him from a premium flight")             public void testPremiumFlightVipPassenger() {                 assertAll("Verify all conditions for a VIP passenger and a premium flight",                         () -> assertEquals(true, premiumFlight.addPassenger(james)),                         () -> assertEquals(1, premiumFlight.getPassengersList().size()),                         () -> assertEquals(true, premiumFlight.removePassenger(james)),                         () -> assertEquals(0, premiumFlight.getPassengersList().size())                 );             }         }     } }
  运行测试用例发现有个测试用例失败,需要实现逻辑使测试用到通过;另外发现普通类型的乘客的测试用例是通过的,说明简单的代码已经满足业务逻辑,只需要实现VIP类型乘客的逻辑。
  实现VIP乘客的业务逻辑:public class PremiumFlight extends Flight {      public PremiumFlight(String id) {         super(id);     }      @Override     public boolean addPassenger(Passenger passenger) {         if (passenger.isVip()) {             return passengers.add(passenger);         }         return false;     }      @Override     public boolean removePassenger(Passenger passenger) {         if (passenger.isVip()) {             return passengers.remove(passenger);         }         return false;     }  }
  偶然发现程序有个BUG,同一个乘客可以重复添加,这应该不允许的,需要增加这段逻辑。TDD方式先写测试用例,使用@RepeatedTest及RepetitionInfo实现重复执行。
  AirportTestimport org.junit.jupiter.api.*;  import java.util.ArrayList;  import static org.junit.jupiter.api.Assertions.*;  public class AirportTest {      @DisplayName("Given there is an economy flight")     @Nested     class EconomyFlightTest {          private Flight economyFlight;         private Passenger mike;         private Passenger james;          @BeforeEach         void setUp() {             economyFlight = new EconomyFlight("1");             mike = new Passenger("Mike", false);             james = new Passenger("James", true);         }          @Nested         @DisplayName("When we have a regular passenger")         class RegularPassenger {              @Test             @DisplayName("Then you can add and remove him from an economy flight")             public void testEconomyFlightRegularPassenger() {                 assertAll("Verify all conditions for a regular passenger and an economy flight",                         () -> assertEquals("1", economyFlight.getId()),                         () -> assertEquals(true, economyFlight.addPassenger(mike)),                         () -> assertEquals(1, economyFlight.getPassengersSet().size()),                         () -> assertEquals("Mike", new ArrayList<>(economyFlight.getPassengersSet()).get(0).getName()),                         () -> assertEquals(true, economyFlight.removePassenger(mike)),                         () -> assertEquals(0, economyFlight.getPassengersSet().size())                 );             }              @DisplayName("Then you cannot add him to an economy flight more than once")             @RepeatedTest(5)             public void testEconomyFlightRegularPassengerAddedOnlyOnce(RepetitionInfo repetitionInfo) {                 for (int i = 0; i < repetitionInfo.getCurrentRepetition(); i++) {                     economyFlight.addPassenger(mike);                 }                 assertAll("Verify a regular passenger can be added to an economy flight only once",                         () -> assertEquals(1, economyFlight.getPassengersSet().size()),                         () -> assertTrue(economyFlight.getPassengersSet().contains(mike)),                         () -> assertTrue(new ArrayList<>(economyFlight.getPassengersSet()).get(0).getName().equals("Mike"))                 );             }         }          @Nested         @DisplayName("When we have a VIP passenger")         class VipPassenger {             @Test             @DisplayName("Then you can add him but cannot remove him from an economy flight")             public void testEconomyFlightVipPassenger() {                 assertAll("Verify all conditions for a VIP passenger and an economy flight",                         () -> assertEquals("1", economyFlight.getId()),                         () -> assertEquals(true, economyFlight.addPassenger(james)),                         () -> assertEquals(1, economyFlight.getPassengersSet().size()),                         () -> assertEquals("James", new ArrayList<>(economyFlight.getPassengersSet()).get(0).getName()),                         () -> assertEquals(false, economyFlight.removePassenger(james)),                         () -> assertEquals(1, economyFlight.getPassengersSet().size())                 );             }              @DisplayName("Then you cannot add him to an economy flight more than once")             @RepeatedTest(5)             public void testEconomyFlightVipPassengerAddedOnlyOnce(RepetitionInfo repetitionInfo) {                 for (int i = 0; i < repetitionInfo.getCurrentRepetition(); i++) {                     economyFlight.addPassenger(james);                 }                 assertAll("Verify a VIP passenger can be added to an economy flight only once",                         () -> assertEquals(1, economyFlight.getPassengersSet().size()),                         () -> assertTrue(economyFlight.getPassengersSet().contains(james)),                         () -> assertTrue(new ArrayList<>(economyFlight.getPassengersSet()).get(0).getName().equals("James"))                 );             }         }     }      @DisplayName("Given there is a business flight")     @Nested     class BusinessFlightTest {         private Flight businessFlight;         private Passenger mike;         private Passenger james;          @BeforeEach         void setUp() {             businessFlight = new BusinessFlight("2");             mike = new Passenger("Mike", false);             james = new Passenger("James", true);         }          @Nested         @DisplayName("When we have a regular passenger")         class RegularPassenger {              @Test             @DisplayName("Then you cannot add or remove him from a business flight")             public void testBusinessFlightRegularPassenger() {                 assertAll("Verify all conditions for a regular passenger and a business flight",                         () -> assertEquals(false, businessFlight.addPassenger(mike)),                         () -> assertEquals(0, businessFlight.getPassengersSet().size()),                         () -> assertEquals(false, businessFlight.removePassenger(mike)),                         () -> assertEquals(0, businessFlight.getPassengersSet().size())                 );             }         }          @Nested         @DisplayName("When we have a VIP passenger")         class VipPassenger {              @Test             @DisplayName("Then you can add him but cannot remove him from a business flight")             public void testBusinessFlightVipPassenger() {                 assertAll("Verify all conditions for a VIP passenger and a business flight",                         () -> assertEquals(true, businessFlight.addPassenger(james)),                         () -> assertEquals(1, businessFlight.getPassengersSet().size()),                         () -> assertEquals(false, businessFlight.removePassenger(james)),                         () -> assertEquals(1, businessFlight.getPassengersSet().size())                 );             }              @DisplayName("Then you cannot add him to a business flight more than once")             @RepeatedTest(5)             public void testBusinessFlightVipPassengerAddedOnlyOnce(RepetitionInfo repetitionInfo) {                 for (int i = 0; i < repetitionInfo.getCurrentRepetition(); i++) {                     businessFlight.addPassenger(james);                 }                 assertAll("Verify a VIP passenger can be added to a business flight only once",                         () -> assertEquals(1, businessFlight.getPassengersSet().size()),                         () -> assertTrue(businessFlight.getPassengersSet().contains(james)),                         () -> assertTrue(new ArrayList<>(businessFlight.getPassengersSet()).get(0).getName().equals("James"))                 );             }         }     }      @DisplayName("Given there is a premium flight")     @Nested     class PremiumFlightTest {         private Flight premiumFlight;         private Passenger mike;         private Passenger james;          @BeforeEach         void setUp() {             premiumFlight = new PremiumFlight("3");             mike = new Passenger("Mike", false);             james = new Passenger("James", true);         }          @Nested         @DisplayName("When we have a regular passenger")         class RegularPassenger {              @Test             @DisplayName("Then you cannot add or remove him from a premium flight")             public void testPremiumFlightRegularPassenger() {                 assertAll("Verify all conditions for a regular passenger and a premium flight",                         () -> assertEquals(false, premiumFlight.addPassenger(mike)),                         () -> assertEquals(0, premiumFlight.getPassengersSet().size()),                         () -> assertEquals(false, premiumFlight.removePassenger(mike)),                         () -> assertEquals(0, premiumFlight.getPassengersSet().size())                 );             }         }          @Nested         @DisplayName("When we have a VIP passenger")         class VipPassenger {              @Test             @DisplayName("Then you can add and remove him from a premium flight")             public void testPremiumFlightVipPassenger() {                 assertAll("Verify all conditions for a VIP passenger and a premium flight",                         () -> assertEquals(true, premiumFlight.addPassenger(james)),                         () -> assertEquals(1, premiumFlight.getPassengersSet().size()),                         () -> assertEquals(true, premiumFlight.removePassenger(james)),                         () -> assertEquals(0, premiumFlight.getPassengersSet().size())                 );             }              @DisplayName("Then you cannot add him to a premium flight more than once")             @RepeatedTest(5)             public void testPremiumFlightVipPassengerAddedOnlyOnce(RepetitionInfo repetitionInfo) {                 for (int i = 0; i < repetitionInfo.getCurrentRepetition(); i++) {                     premiumFlight.addPassenger(james);                 }                 assertAll("Verify a VIP passenger can be added to a premium flight only once",                         () -> assertEquals(1, premiumFlight.getPassengersSet().size()),                         () -> assertTrue(premiumFlight.getPassengersSet().contains(james)),                         () -> assertTrue(new ArrayList<>(premiumFlight.getPassengersSet()).get(0).getName().equals("James"))                 );             }         }     } } import java.util.*;  public abstract class Flight {      private String id;     Set passengers = new HashSet<>();      public Flight(String id) {         this.id = id;     }      public String getId() {         return id;     }      public Set getPassengersSet() {         return Collections.unmodifiableSet(passengers);     }      public abstract boolean addPassenger(Passenger passenger);      public abstract boolean removePassenger(Passenger passenger);  }
  TDD风格:先写测试用例再实现业务逻辑,测试覆盖率100%。

又走一个!28岁国乒大将长文宣布退出国家队,队友未来会更好北京时间1月6日,28岁的国乒大将马特发文,宣布自己离开国家队,但和之前方博周雨闫安等人一样,并未选择告别乒乓球。马特表示,经过与队伍一段时间的沟通,最后还是选择离开光荣的国家乒乓云顶之弈给大虫子一身攻击装备,还是肉装更好?以大虫子为核心体系的阵容,在游戏里相当火爆。大虫子本身拥有巨大的坦度,在给大虫子的装备上,也有肉装和攻击装两种套路。出肉装我们很好理解,那么出攻击装备的大虫子,真的适合版本节奏吗?冰雪传奇2021最火热现象及传奇手游装备篇详解(大结局)嗨嗨!我是阿伟,今天给大家带来上篇的装备讲解续集。本游戏除了基础装备转生装备十二生肖装备魔道装备合成装备还有特戒装备十二神器和神秘装备。其中最后一种装备的功能可是和前面的都大不相同转投WearOS的三星GalaxyWatch4classic能玩吗?三星GalaxyWatch4系列已经上市,这是三星放弃自主研发的Tizen系统,转投安卓WearOS系统之后发布的首个智能手表系列。那么,搭载了WearOS的三星GalaxyWat别瞧不起三星手机,岁末年初捡漏这3款,体验和配置都很优秀三星GalaxyNote20Ultra在屏幕设计方面,三星GalaxyNote20Ultra采用了一块6。9英寸屏幕,该屏幕为第二代DynamicAMOLED屏幕,其分辨率最高可以傲世龙城火龙打金恶魔山脉怎么进永恒屠龙一战称王恶魔山脉玩法哈喽,大家好呀,我是爱玩游戏的软软呀,欢迎来到爱玩游戏的软软。今天给小伙伴们带来的是关于三职业热血传奇傲世龙城的相关攻略哦。恶魔山脉是一块该机打宝地图那我们应该怎么进入呢?薇恶魔山王者荣耀西施攻略西施这个英雄比较吃队友,运用好一技能和二技能是玩好英雄的关键,让你击杀和助攻双丰收。笔者根据自己玩西施的经验与小伙伴们分享一下。一阵容搭配辅助英雄最好是一个肉,如果队友选瑶作为辅助王者荣耀赛季末期,各位置T0大盘点,赶紧拿来上分王者荣耀S25落子无悔赛季已经进入尾声,小编就来给大家盘点一下各个位置的T0英雄,在赛季末期再冲一波分。对抗路司空震,夏洛特黑切和金色圣剑的改动使司空震直接进入T0,带上狂暴,4级王者荣耀中需要知道的冷知识第二篇1长按好友头像,查看信息,在组队界面,长按好友头像,就能看到他在玩哪个模式跟所玩的英雄。所以嘞,看到好友在游戏中不要急,查看一下是不是在火焰山,再考虑要不要等等好友。2嬴政西施和蒙王者荣耀S26赛季需知的7点新变化,暗信必然崛起,守约会加强大家好,我是秋豆。随着今年步入尾声,王者荣耀S26赛季玉城之子也将于一月份正式上线。新赛季伴随着许多改变,提前知悉版本变更才能更好地上分。S26赛季有哪些必须知道的7点新变化呢?11号更新0。5G,留888点券巨赚,虞姬吕布重做突袭,扁鹊笑了可乐要加冰,乔妹在你心,大家好我是小乔妹,每天为您分享有趣的王者荣耀新皮肤新版本,最新攻略等文章内容。王者荣耀即将在元旦节迎来一波小更新,此次更新会有不少新活动和新皮肤上线正式服当崩坏三大鸭鸭脚打140难度指南作者NGA暮春零八我是半毕业大鸭鸭(差上位而且没有皮里上,只能用泰勒斯),刚开始玩乐土所以连云墨都还没解锁。于是在搜了一些攻略之后摸到了这套操作难度极低效果很好的玩法。带人选天赋战世嘉吞食天地3,真男人司马懿是真的持久,游戏结局还有彩蛋回顾吞食天地3的剧情已经有一段时间了,今天终于可以结束了,游戏最后的两个大迷宫是真的迷,让玩家痛不欲生。上次说到打败典韦,典韦的遗言还不忘告诉刘备等人他是万人斩,本以为典韦已经是真含金量最高的4款皮肤,内测皮肤过时了,这三款还都是免费皮肤在之前,王者荣耀最稀有的皮肤莫过于女武神,因为当时艾琳还没有重做回归,能拥有的只能是内测玩家,不过到了现在,艾琳可以直接用金币购买,而且在经历了许多次活动之后,大家都有足够的蔷薇之我的世界如何驯服和繁殖羊驼?其实很简单,只需要这样做在我的世界里面有一种非常可爱的小动物,羊驼。长得很呆萌无辜的样子,真是让玩家心动,从而想去驯服它。在现实世界里面它还有个好玩的别称,不过听起来像是骂人的话,这里就不说了,羊驼和马一传世手游传奇世界群英版微变传世手游转生系统的详细介绍Hello大家好,最近传奇世界群英版真的是太火了,好多小伙伴也是加入了。小编最近花了很多时间去钻研。来个大家说一些小技巧吧。比较多先说一个最简单的转生系统把。虽然转生是大部分传奇传1。76极品传奇蓝月合击职业选择攻略狂暴传奇首饰隐藏属性怎么触发点击上方蓝字关注我们大家好呀我是大家的好朋友毓玉,今天小编给大家分享下,1。76极品传奇狂暴传奇武器持久度越久越好吗?蓝月合击新版三职业选择攻略!一起来看看吧!近期这个狂暴传奇的人韩媒评选2022赛季最值得关注的中单,LPL赛区Doinb,Knight上榜近日韩媒inven正在进行2021的年终盘点,在对整个2021年进行了一些总结后,也开始展望未来的2022新赛季。因为每年这个时候大概都会发布下一年春季赛的开赛日期,所以在新的一年三国志手游组合推荐魏蜀吴三国,如何搭配国家队才是最强的?有人的地方就有江湖,自然少不了比较,尤其是在荣耀新三国中有那么多武将,要论一个第一武将讲个三天三夜都讲不完。但是小孩子才轮谁最强,作为成熟的成年人,我们要从国家的角度来看待问题,魏阴阳师释放技能等于浪费鬼火,某些式神的技能确实没用阴阳师虽然现阶段已经有近200位不同的式神相继加入到了游戏内的平安京世界里,但不得不说的是,玩家们有一个十分明显的特点,就是大家都习惯用强度或者颜值来篇评价现阶段游戏内的这一系列式王者荣耀吕布二技能伤害移除,对抗强度降低?何不试试这套出装Hello,大家好,这里是兔八哥聊游戏!关注我,为您带来不一样的游戏理解!吕布这个英雄,算是王者荣耀里面,长盛不衰的存在,但是最近因为他的二技能伤害移除,导致大量玩家觉得这个英雄强电视剧对手观后感生活有乐趣,多看电视剧,不做剧透,只谈感受。今天给大家带来的是最新谍战剧对手我觉得挺好看的。题材新颖,有一种生活中难以接触的神秘感。对绝大多数人来讲,国家安全局是很少接触的,而电视
现在入手OPPOReno6Pro刚刚好数码圈这一年12月的最后一天,也是今年最后的一个夜。细数今年的手机市场是冷暖交加,也更是这百味人生。在这如火如荼的手机数码圈里,我们一起来回味一下曾经的旗舰级OPPOReno6Pr3款手机配6000毫安大容量电池,支持反向充电,关键时可当充电宝现在人们使用手机的时间越来越长,同时手机的功耗也越来越大了,担心手机在使用时没电,经常为电池的电量而焦虑,虽然说现在的手机电池越做越大,但是也出现手机电量不足的情况,今天就为大家推SwitchOLED国行来了!2599元买吗?腾讯NintendoSwitch官方宣布,NSOLED国行版于今日开启预售,定价2599元,并将于1月11日正式发售。京东官方旗舰店预售链接官方公告原文1月4日,腾讯引进NinteCookingSimulatorVR获2021Steam年度最佳VR游戏(映维网2022年01月04日)Steam日前正式公布了2021年各类别的最终获奖名单。其中,生化危机村庄获得了年度最佳游戏,而CookingSimulatorVR则荣获2021年国行版SwitchOLED今日开启预售官方价格2599元国行版NintendoSwitchOLED于北京时间今日(1月4日)上午9点在京东NintendoSwitch官方旗舰店正式开启预购,并将于1月11日正式发售。价格为2599元,预大换血!火箭湖人酝酿3方交易!伍德兰德尔辅佐詹姆斯争冠?NBA常规赛继续进行,火箭队客场113133输给76人队,遭遇8连败,落后鹈鹕队3。5个胜场,坐稳了西部倒数第一的位置。本场比赛虽然伍德小波特被禁赛,但是大闹球队更衣室这样的重大错王者荣耀峡谷三大砍王,典韦凯曹操,谁最凶?普攻伤害爆炸,刀刀贴脸的英雄,凯典韦曹操确实很强势。都是峡谷中出了名的单挑选手,大招一开如疯狗一般砍杀敌人。那么,这三位究竟谁更恐怖一些呢?第三位疯狗典韦典韦的伤害是很高的,20层RNG打了几场训练赛?小虎透露连输5局胜率依旧有75新赛季的RNG是非常备受期待的一支队伍,S11赛季RNG已经充分地证明了队伍的实力,而在S12赛季RNG不仅引进了Bin,还买下了EDG的冠军教练朱开对队伍进行补强,因此S12赛季弹射世界我该如何设计一个能用盘子作者NGAMydg尘埃引言队伍为什么这么叫认识各类型队伍。可能经常会在版里看到一些队伍的命名如Fever技伤浑身以及属PF等,这是以该队伍的特色作为命名的方式。这个界面显示了角色的QuestHaven即将推出在VR中畅玩桌面游戏QuestHaven是一款即将推出的桌面模拟器,旨在为VR和PC用户提供玩桌面游戏所需的所有工具。该项目背后的团队表示,QuestHaven通过让用户构建环境并导入游戏规则,来玩大寂然冲击国一诸葛亮,打开诸葛亮国服榜被吓住国一战力这么高?说起寂然,相信大多数玩家都会想到韩信。毫无疑问,寂然是韩信这个英雄的天花板,早期的他率先使用三指操作,还开创了韩信十六吸打法,那时候寂然的手法无懈可击,完全不输职业选手。巅峰赛时代