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

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%。

27年沉浮,北溪背后的历史暗战27年沉浮,北溪背后的历史暗战这几天,历经波折的北溪天然气管道,因为被蓄意破坏又成了各方关注的焦点。焦点问题之一,是其中的利害关系。北溪爆炸,卖方俄罗斯称修复天然气管道至少需要6个10月国内带钢价格或先扬后抑运行和焦炭谨慎乐观!钢价能否上涨目录17家钢厂下调废钢采购价2050元29月全国钢铁行业PMI小幅回落,终值51。3310月高需求与高成本支撑,焦炭谨慎乐观410月国内带钢市场价格或先扬后抑运行5金九不金,银十难第70篇人人都爱用的信用货币,却不一定是很有信用的好货币本节摘自原创书籍初心部落,找回失落的家园!第二部分文明2。0勇敢者游戏(续前节)5信用货币现在终于要谈到本节的真正重点了信用货币信用货币是由国家法律规定的,强制流通,不以任何贵金属老乡别走,快来买房今天一堆好消息,一时之间都不知道先说哪个比较好了emmm就先从今天的行情说起吧。第一个好消息,从明天开始,大家的票有长达9天时间不会跌了,给自己点个赞。昨天人民币才刚给完面子,不料苏州唯一法人城商行,苏州银行区域禀赋突出,改革提质增效(报告出品方分析师平安证券袁喆奇)一概况苏州唯一法人城商行,规模稳健增长苏州银行是苏州地区唯一的法人城商行,由东吴农商行改制转变而来。苏州银行的前身为江苏东吴农村商业银行股份有限公佛山房价四连跌,佛山楼市跌落神坛,佛山房价分析第45期佛山楼市的不败神话结束了,佛山房价四连跌,佛山楼市分析第45期。现在佛山房价还是跌个不停,佛山楼市这次降温期持续的比较久。佛山房价从去年下半年就已经开始下跌了,一直跌到了现在,已经市值蒸发2548亿美元!失去华为订单后,台积电受到了欺负华为未被打压之前,曾一度是台积电的第二大客户,为其贡献了约15的订单量,且都是最先进制程的芯片。因众所周知的原因,台积电失去了华为的订单,但刘德音当时还十分有底气,并不觉得受影响。从电子废品到百元难求,CCD卡片机掀起复古热现代快报讯(见习记者史童歌文摄)金属感的机身,低像素粗颗粒的画质,高饱和度的色彩近日,在某社交平台上,曾一度风靡的CCD卡片机重新翻红,成为时尚关键词。现代快报记者探访发现,几年前因为不可以涩涩,这游戏从满分好评跌到差评如潮文艾渴echo从天堂之巅跌入地狱底层究竟要多长时间呢?一个月?一年?十年?一辈子?或者你可能从未考虑过类似的问题,也坚信自己就算没有吉人天相,也不至于会倒霉成这个样子不过对国内独立2022。10。04国庆第四天祝福你,伟大的祖国有一面鲜红的旗帜高高飘扬在十月的神州大地那是党的旗帜无数革命先烈赴汤蹈火用鲜血染红理想用忠魂铸就强盛她指明中国的发展方向她指向哪里哪里就鲜艳夺目充满生机有一面鲜红的旗帜飘扬在华夏儿用摄影人的方式,为祖国庆生91。8美图秀冬虫夏草摄金风徐徐,我们又迎来了丰收时节晨曦昼夜,摄影人用敏锐的目光发现世间的变化白鹭轻盈的落在树冠,银杏退去绿装披上金甲,火塘边的情歌唱给暮色夕阳,露珠颤抖着折射第一缕曙光生命的
专注品质打造质量王者,云米科技用心缔造智能家家是我们最温暖的避风港,每个家庭所憧憬的生活方式不尽相同但都充满心意,也因此越来越多消费者会在家电的选择上格外用心,为了让我们可以身处在更加有品质,品位的家中。比如越来越受年轻人喜别再被蒙蔽!这3类假酒早已被315曝光!常喝酒的酒友尽早知晓今天是2023年的消费者权益日,再过几个钟头,便迎来众人期待的315晚会。按照惯例,这个日子会曝光出大量假货。去年被曝出的老坛酸菜让人深感意外,网友不禁感慨原来假货真是无处不在!当小家电的大市场创新产品质量正在成为关键词在当今快节奏的生活中,小家电已经成为我们生活中必不可少的一部分。从早上的咖啡机面包机到晚上的电饭煲电磁炉,小家电在方便我们生活的同时也逐渐成为了一个庞大的市场。小家电市场的崛起离不饭局变天了?埋头吃饭的人变多,白酒却没什么人喝了,这是怎么了说起饭局大家第一印象是什么?那必然是亲朋好友欢聚一堂,吃菜畅谈,喝酒划拳,好不热闹,这既可以是亲友联系感情的时刻,也可以是最适合商务合作人情世故的场合。然而这两年,我国的饭局聚会或以14亿多老百姓对环境品质的期盼为指引锚定绿色发展目标推动发展方式绿色转型,是今年政府工作报告的一项工作重点。过去,污染防治被更多提及,而在中国式现代化提出之后的首次全国两会,政府工作报告以绿色发展统领治污降碳生态建设和绿色生活方式等爷爷的心尖尖自酿酒为何如今辉煌不再?酒友3大现实要认清爷爷的心尖尖自酿酒为何如今辉煌不再?酒友3大现实要认清我爷爷以前就是个老酒腻子,特别爱喝酒,但是他喝酒喝的是什么?别人家里自酿的散酒,就是那种很便宜,花一点钱就能一下子买一大桶的那匠心品质,每天都是315在这3。15国际消费权益日即将到来之际,就在昨天3月14日,媒体曝光了一则令人咋舌的新闻!!!广东汕头一家食品加工厂,生产工人赤脚踩在南姜上面,说是给酸咸菜增加所谓的风味!!!!这如何提振消费信心?链家推出品质服务和安心保障今年315的主题是提振消费信心,对企业来说,如何能让消费意愿被最大激活,成为一次大考。对此,链家给出的答案是左手品质服务,右手安心保障,多措并举让消费者在房产交易中,无后顾之忧敢消2022年100个城市消费者满意度测评结果出炉,你的家乡排第几?3月14日中国消费者协会发布2022年100个城市消费者满意度测评报告快来看看你的家乡排名第几100个城市中,排名前十的城市为苏州青岛杭州烟台南京佛山无锡厦门北京宜昌。其中,苏州市春日里的企业生产见闻鹤壁市城乡一体化示范区垂天智能制造河南日报客户端记者陈晨实习生刘丹丹3月13日,位于鹤壁市城乡一体化示范区的河南垂天智能制造有限公司工人正在加工智慧合杆。河南垂天智能制造有限公司成立于2020年12月,注册资本1亿河南省消协联合顶端共同推出315食品安全问卷征集活动顶端新闻河南商报记者郭爽爽一年一度315,今年有个特别节目。为保障舌尖上的安全,履行消费者权益保护法赋予消协组织的职责,近日,河南省消费者协会联合顶端新闻,共同推出315特别活动你