Code Smell 299 - Jinsi ya kurekebisha mipangilio ya mtihani

kwa Maximiliano Contieri7m2025/05/10
Read on Terminal Reader

Ndefu sana; Kusoma

Mipangilio yaliyotumika tu kwa sehemu hufanya majaribio yako kuwa zaidi na vigumu kuelewa.
featured image - Code Smell 299 - Jinsi ya kurekebisha mipangilio ya mtihani
Maximiliano Contieri HackerNoon profile picture

Wakati mipangilio yako ya mtihani ni kubwa kuliko mtihani halisi

TL;DR: Usanidi uliokithiri unaotumika tu kwa sehemu hufanya majaribio yako zaidi na vigumu kuelewa.

TL;DR: Usanidi uliokithiri unaotumika tu kwa sehemu hufanya majaribio yako zaidi na vigumu kuelewa.

matatizo ya

  • Kuunganisha
  • Uwezo wa kusoma
  • Kupoteza muda wa utekelezaji
  • Maelezo ya mazingira ya uongo
  • Utafiti wa kujitegemea
  • Uhifadhi wa ngumu
  • Suite ya Utafiti wa Brittle
  • Upatikanaji wa utegemezi
  • Utekelezaji wa polepole
  • Mtazamo wa uongo

ufumbuzi wa

  1. Kuanzisha mbinu za usanidi
  2. Tumia vipengele maalum vya mtihani
  3. Kuanza kwa Setup Minimal
  4. Utekelezaji wa mbinu za majaribio ya kiwanda

Mabadiliko ya mwaka ️

https://hackernoon.com/improving-the-code-one-line-at-a-time

https://maximilianocontieri.com/refactoring-011-replace-comments-with-tests

Muhtasari wa

Wakati wa kuandika majaribio, unaweza kuunda mbinu kubwa ya kuanzisha ambayo inaanzisha vitu mbalimbali.


Ikiwa mtihani mmoja tu hutumia vitu hivi vyote, wakati mtihani mwingine hutumia chini ndogo tu, unaunda overhead zisizohitajika.


Tatizo hili la kawaida linatokea wakati unatarajia kwamba majaribio ya baadaye yanaweza kuhitaji uanzishaji mkubwa, au unapoendelea kuongeza kwenye uanzishaji unaoendelea bila kutathmini kile kinachohitajika.


Majaribio ni vigumu kuelewa kwa sababu yana mifumo isiyohusiana, na ni polepole kwa kutekeleza kwa sababu unaanzisha vitu ambavyo havitumiwa.

Kodi ya sampuli

Hakuna makosa ya

public class TVSeriesTest {
  private MovieSeries theEthernaut;
  private List<Character> characters;
  private List<Episode> episodes;
  private User user;
  private UserPreferences preferences;
  private RatingSystem ratingSystem;
  private StreamingService streamingService;
  private List<Review> reviews;
  
  @BeforeEach
  public void setUp() {
    // Create a complex movie series with many characters
    characters = new ArrayList<>();
    characters.add(new Character("Juan Salvo", "Richard Darin"));
    characters.add(new Character("Helen", "Carla Peterson")); 
    characters.add(new Character("Favalli", "Cesar Troncoso")); 
    
    // Create episodes
    episodes = new ArrayList<>();
    episodes.add(
      new Episode("The Snow", 2025, 121));
    episodes.add(
      new Episode("The Hands Strikes Back", 2027, 124)); 
    
    // Create user with preferences
    preferences = new UserPreferences();
    preferences.setPreferredGenre("Science Fiction");
    preferences.setPreferredLanguage("English");
    preferences.setSubtitlesEnabled(true);
    user = new User("JohnDoe", "john@example.com", preferences);
    
    // Create rating system with reviews
    ratingSystem = new RatingSystem(10);
    reviews = new ArrayList<>();
    reviews.add(
      new Review(user, "The Snow", 9, "Classic!"));
    reviews.add(
      new Review(user, "The Hands Strikes Back", 10, "Best one!"));
    ratingSystem.addReviews(reviews);
    
    // Create streaming service
    streamingService = new StreamingService("Netflix");
    streamingService.addMovieSeries("The Eternaut");
    
    // Finally create the movie series with all components
    theEthernaut = 
      new TVSeries("The Ethernaut", characters, episodes);
    theEthernaut.setRatingSystem(ratingSystem);
    theEthernaut.setAvailableOn(streamingService);
    
    // This method is too long. That is another smell
  }
  
  @Test
  public void testTVSeriesRecommendation() {
    // This test uses almost everything from the setup
    RecommendationEngine engine = new RecommendationEngine();
    List<Episode> recommended =
      engine.recommendations(user, theEternaut);
    
    assertEquals(2, recommended.size());
    assertEquals("The Hands Strikes Back",
      recommended.get(0).title());
    // You are testing the recomendation Engine
    // This is not this object's responsibility
  }
  
  @Test
  public void testEpisodeCount() {
    // This test only needs the episodes count
    assertEquals(2, theEthernaut.episodes().size());
  }
  
  @Test
  public void testCharacterLookup() {
    // This test only needs the characters
    // And not the rest of the setup
    Character juan = theEternaut.findCharacterByName("Juan Salvo");
    assertNotNull(juan);
    assertEquals("Juan Salvo", juan.actor());
  }
}

Kwa kweli

public class TVSeriesTest {
  // No shared setup
  
  @Test
  public void testRecommendation() {
    // Create only what's needed for this specific test
    // And move this test with the behavior
    TVSeries theEternaut = createTheEternautSeries();
    User homer = createUserWithPreferences();
    addReviewsForUser(theEternaut, homer);
    
    RecommendationEngine engine = new RecommendationEngine();
    List<Episode> recommended =
      engine.recommendations(homer, theEternaut);
    
    assertEquals(2, recommended.size());
    assertEquals("The Hands Strikes Back", 
      recommended.get(0).title());
  }
  
  @Test
  public void testEpisodeCount() {
    // Only create what's needed - just the episodes
    TVSeries theEternaut = new TVSeries("The Ethernaut");
    theEternaut.addEpisode(
      new Episode("The Snow", 2025, 121));
    theEternaut.addEpisode(
      new Episode("The Hands Strikes Back", 2027, 124)); 
    
    assertEquals(2, theEternaut.episodes().size());
  }
  
  @Test
  public void testCharacterLookup() {
    // Only create what's needed - just the characters
    TVSeries theEternaut = new TVSeries("The Eternaut");
    theEternaut.addCharacter(
      new Character("Juan Salvo", "Richard Darin"));
    theEternaut.addCharacter(
      new Character("Helen", "Carla Peterson")); 
    
    Character juan = theEternaut.findCharacterByName("Juan Salvo");
    assertNotNull(juan);
    assertEquals("Richard Darin", juan.actor());
  }
  
  // Helper methods for specific test setup needs
  private TVSeries createTheEternautTVSeries() {
    TVSeries series = new TVSeries("The Eternaut");
    series.addEpisode(
      new Episode("The Snow", 2025, 121));
    series.addEpisode(
      new Episode("The Hands Strikes Back", 2027, 124)); 
    return series;
  }
  
  private User createUserWithPreferences() {
    UserPreferences preferences = new UserPreferences();
    preferences.setPreferredGenre("Science Fiction");
    preferences.setPreferredLanguage("English");
    return new User("JohnDoe", "john@example.com", preferences);
  }
  
  private void addReviewsForUser(TVSeries series, User user) {
    RatingSystem ratingSystem = new RatingSystem(10);
    ratingSystem.addReview(
      new Review(user, "The Snow", 9, "Classic!"));
    ratingSystem.addReview(
      new Review(user, "The Hands Strikes Back", 10, "Best one!"));
    series.setRatingSystem(ratingSystem);
  }
}

Utambulisho wa

  • [x] Semi ya moja kwa moja

Unaweza kugundua ladha hii kwa kulinganisha kile kilichowekwa katika mbinu za kuanzisha dhidi ya kile kilichotumiwa katika kila mtihani.


Tazama majaribio ambayo hutumia chini ya 50% ya vitu vilivyopangwa.


Zana za ufafanuzi wa msimbo zinaweza kusaidia kutambua vitu vya usambazaji vinavyotumika kwa kuonyesha ni sehemu gani za usambazaji ambazo hazifanyiwa majaribio fulani.


Ikiwa unapata mwenyewe kuandika masharti katika mipangilio ili kuunda mazingira tofauti, ni ishara wazi kwamba unahitaji mipangilio maalum ya mtihani badala yake.

Tarehe ya ️

  • Utafiti wa

Kiwango cha

  • [x] wa kati

Kwa nini ni muhimu kwa ajili ya mazoezi ️

Kila mtihani unapaswa kutafakari hali maalum ya dunia halisi.


Mipangilio ya kupotea yanavunja uwazi huu, na inafanya kuwa vigumu kuona kile kinachofanywa na kuongeza uwezekano wa makosa.


Hii ya kuharibiwaBijection yahufanya majaribio kuwa vigumu kuelewa kwa sababu huwezi kuamua ni vipengele gani vya kuanzisha ni muhimu kwa ajili ya majaribio na ni sauti tu.


Wakati mtihani unashindwa, utatumia muda zaidi wa kuchunguza viungo ambavyo vinaweza kuwa si muhimu kwa kushindwa.


Majaribio huwa na udhaifu zaidi kwa sababu mabadiliko ya vitu havitumika bado yanaweza kuvunja majaribio ikiwa vitu hivi vinashiriki katika mchakato wa kuanzisha.

Mwisho wa kizazi

Waendeshaji wa msimbo wa AI mara nyingi huunda ladha hii wakati wanazalisha vifaa vya majaribio vya kina ambavyo hujaribu kufunika matukio yote iwezekanavyo.


Wao wanapendekeza ukamilifu juu ya kuzingatia, na kusababisha mbinu za uanzishaji zilizoongezeka ambazo zinaanzisha vitu zaidi kuliko zinahitajika kwa majaribio ya kibinafsi.

Utafiti wa

AI inaweza kugundua ladha hii kwa maelekezo rahisi kama vile "Optimize mipangilio yangu ya mtihani ili kuingiza tu kile kinachohitajika kwa kila mtihani."


Vifaa vya kisasa vya AI vinaweza kulinganisha msimbo wa kuanzisha na matumizi ya njia ya majaribio na kupendekeza refactorings ya lengo, kuacha kuanzisha kwa kushirikiana na kuanzisha kwa ajili ya majaribio.

Tafadhali jaribu!

Kumbuka: Msaidizi wa AI hufanya makosa mengi

Prompt iliyopendekezwa: Kuondoa majaribio na usanidi

Prompt iliyopendekezwa: Kuondoa majaribio na usanidi

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Grok

Grok

Qwen

Qwen

Mchezo wa

Mchezo wa

Claude wa

Claude wa

wasiwasi

wasiwasi

Mtoto wa

Mtoto wa

wa Gemini

wa Gemini

Utafutaji wa

Utafutaji wa

Malengo ya AI

Malengo ya AI

Kijani

Kijani

Kwenye

Kwenye

Mwisho wa

Mipangilio ya majaribio ya juu ambayo huanza vitu vinahitajika tu na majaribio machache hufanya mkusanyiko wako wa majaribio kuwa vigumu kuelewa na kudumisha.

Unapofanya mipangilio ya lengo ambayo inajumuisha tu kile kinachohitaji kila mtihani, unaweza kuboresha uwazi, kasi, na uaminifu wa mtihani wako.

Kumbuka kwamba mtihani una lengo la kuandika tabia kupitia mifano naBadilisha Maoni.


Maonyesho mengi yasiyofaa hufanya mifano haya kuwa chini ya kusoma. majaribio safi husema hadithi wazi bila kuchanganyikiwa.

Ujumbe wako

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xi-sit35t1

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxiii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xli

Maelezo zaidi

Maelezo ya Disclaimer

Hifadhi ya Hifadhi ni ya MimiMaoni ya.

Mkopo wa

Picha yaMaana ya SimoniyaUsiku wa


Ikiwa unahitaji kuunda muundo mkubwa kabla ya mtihani, labda unajaribu kupitia ngazi nyingi

Ikiwa unahitaji kuunda muundo mkubwa kabla ya mtihani, labda unajaribu kupitia ngazi nyingi

Uwanja wa James


Makala hii ni sehemu ya mfululizo wa CodeSmell.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks