Shayalp1 Ответов: 2

Как сделать модульное тестирование на языке Си#


Привет, я вообще-то новичок в программировании, у меня было задание создать игру с одним экраном, и теперь я должен провести тесты на ней. Я совершенно не знаю, как провести тест в Visual Studio. Кто-нибудь может мне помочь, я застрял на этом уже около недели.

Это те задачи, которые я должен проверить:

1. крючок должен упасть при прослушивании события щелчка.
2. предметы (камень, драгоценный камень и денежный мешок) должны прикрепляться к крючку при столкновении.
2. сбор предметов - собранный предмет должен быть отключен при сборе.
3. Количество баллов должно увеличиваться в зависимости от стоимости собранного предмета.
4. отображение сообщения “Вы выиграли” при достижении целевого балла.
5. Игра должна сбрасываться после того, как таймер иссякнут.

Это мой код для крючка:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Hook : MonoBehaviour
{
    [SerializeField]
    private Transform itemHolder;

    private bool itemAttached;

    private HookMovement hookMovement;

    private PlayerAnimation playerAnim;

    void Awake() {
        hookMovement = GetComponentInParent<HookMovement>();
        playerAnim = GetComponentInParent<PlayerAnimation>();
    }

    void OnTriggerEnter2D(Collider2D target) {

        if (!itemAttached && (target.tag == Tags.PINK_GEM || target.tag == Tags.GREEN_GEM || target.tag == Tags.BLUE_GEM
        || target.tag == Tags.ORANGE_GEM || target.tag == Tags.PURPLE_GEM
        || target.tag == Tags.LIGHT_BLUE_GEM || target.tag == Tags.PINK_GEM_SMALL || target.tag == Tags.CASH_BAG
        || target.tag == Tags.LARGE_STONE || target.tag == Tags.SMALL_STONE)){

            itemAttached = true;

            target.transform.parent = itemHolder;
            target.transform.position = itemHolder.position;
            // Set the position of the hook to the position of the item

            hookMovement.move_Speed = target.GetComponent<Item>().hook_Speed;

            hookMovement.HookAttachedItem();

            //animate player
            playerAnim.PullingItemAnimation();


            if (target.tag == Tags.PINK_GEM || target.tag == Tags.GREEN_GEM || target.tag == Tags.BLUE_GEM
                || target.tag == Tags.ORANGE_GEM || target.tag == Tags.PURPLE_GEM
                || target.tag == Tags.LIGHT_BLUE_GEM || target.tag == Tags.PINK_GEM_SMALL || target.tag == Tags.CASH_BAG)
            {

                SoundManager.instance.HookGrab_Jewel();
            }
            else if (target.tag == Tags.LARGE_STONE || target.tag == Tags.SMALL_STONE){

                SoundManager.instance.HookGrab_Stone();
            }

                SoundManager.instance.WinchCrank(true);

        } // If the target is an item

        if (target.tag == Tags.DELIVER_ITEM){

            if(itemAttached){

                itemAttached = false;
                Transform objChild = itemHolder.GetChild(0);
                objChild.parent = null;
                objChild.gameObject.SetActive(false);

                playerAnim.IdleAnimation();
                SoundManager.instance.WinchCrank(false);
            }
        }// Remove items after winching

    }// On trigger enter
}


Это для движения крючка:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HookMovement : MonoBehaviour{

    //Rotation of the hook on the z-axis
    public float min_Z = -55f, max_Z = 50f;
    public float rotate_Speed = 5f;

    private float rotate_Angle;
    private bool rotate_Right;
    private bool canRotate;

    public float move_Speed = 3f;

    // Pulling speed of the hook
    private float initial_Move_Speed;

    // How far can the hook extend
    public float min_Y = -4f;
    private float initial_Y;

    private bool moveDown;

    //For Line Renderer
    private RopeRenderer ropeRenderer;

    void Awake() {
        ropeRenderer = GetComponent<RopeRenderer>();
    }

    void Start() {

        initial_Y = transform.position.y;
        initial_Move_Speed = move_Speed;

        canRotate = true;
    }

    void Update(){
        Rotate();
        GetInput();
        MoveRope();
    }

    void Rotate(){
        if(!canRotate)
            return;

        if(rotate_Right){
            rotate_Angle += rotate_Speed * Time.deltaTime;
        } else{
            rotate_Angle -= rotate_Speed * Time.deltaTime;
        }

        //Rotate the hook in an angle on the z-axis
        transform.rotation = Quaternion.AngleAxis(rotate_Angle, Vector3.forward);

        if(rotate_Angle >= max_Z){
            rotate_Right = false;
        } else if(rotate_Angle <= min_Z){
            rotate_Right = true;
        }
    }// Rotate hook

    void GetInput(){

        if(Input.GetMouseButtonDown(0)) {

            if(canRotate) {
                canRotate = false;
                moveDown = true;
            }
        }
    }// Stop rotating the hook and move the rope

    void MoveRope() {

        if(canRotate)
            return;

        if(!canRotate) {
            SoundManager.instance.RopeWhip(true);
            Vector3 temp = transform.position;

            if (moveDown) {
                temp -= transform.up * Time.deltaTime * move_Speed;

            } else {
                temp += transform.up * Time.deltaTime * move_Speed;
            }

            transform.position = temp;
            
             if(temp.y <= min_Y) {
                moveDown = false;
            }//Move the rope up when it reaches minimum y-axis 

             if(temp.y >= initial_Y) {
                canRotate = true;

                // deactivate line renderer
                ropeRenderer.RenderLine(temp, false);

                // reset move speed
                move_Speed = initial_Move_Speed;

                SoundManager.instance.RopeWhip(false);
            }

            ropeRenderer.RenderLine(transform.position, true);
        }

    }// Move Rope


    public void HookAttachedItem(){
        moveDown = false;
    }
}


Это игровой скрипт:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameplayManager : MonoBehaviour {

    public static GameplayManager instance;

    [SerializeField]
    private Text countdownText;

    public int countdownTimer = 60;

    [SerializeField]
    private Text scoreText;

    private int scoreCount;

    [SerializeField]
    private Image scoreFillUI;

    public RectTransform endScreen;
    public Text endMessage;

    void Awake() {
        if (instance == null)
            instance = this;
    }

    void Start()
    {
        DisplayScore(0);
        countdownText.text = countdownTimer.ToString();
        StartCoroutine("Countdown");
    } // Start the countdown when the game starts

    void Update()
    {
        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }
    } // End the game when the esc button is pressed.

    IEnumerator Countdown(){

        yield return new WaitForSeconds(1f);
        countdownTimer -= 1;
        countdownText.text = countdownTimer.ToString();

        if(countdownTimer <= 10){
            SoundManager.instance.TimeRunningOut(true);
        } // Play timer sound if less than 10secs

        StartCoroutine("Countdown");

        if(countdownTimer <= 0){
            StopCoroutine("Countdown");
            SoundManager.instance.GameEnd();
            SoundManager.instance.TimeRunningOut(false);

            StartCoroutine(RestartGame());
        } // Restart the game when the timer ends

    }//Countdown timer

    public void DisplayScore(int scoreValue) {

        if (scoreText == null)
            return;

        scoreCount += scoreValue;
        scoreText.text = "$" + scoreCount;

        scoreFillUI.fillAmount = (float)scoreCount / 100f;
        // Fill the score bar

        if(scoreCount >= 100) {

            StopCoroutine("Countdown");

            endScreen.gameObject.SetActive (true);
            endMessage.gameObject.SetActive (true);
            // Active you won message

            SoundManager.instance.TimeRunningOut(false);
            SoundManager.instance.YayCharacter();
            SoundManager.instance.GameEnd();
            //Stop timer sound FX

            StartCoroutine(RestartGame());

        } // Display score

    }

    IEnumerator RestartGame(){
        yield return new WaitForSeconds(4f);

        UnityEngine.SceneManagement.SceneManager.LoadScene("Gameplay");
    } //Restart the game
}


Что я уже пробовал:

Я совершенно потерялся...пожалуйста, помогите.

2 Ответов

Рейтинг:
6

Shayalp1

Спасибо вам за ваше решение @BillWoodruff, я пытался это сделать, но мне просто нужен кто-то, кто будет направлять меня. Это то, что у меня есть до сих пор

using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

    [TestFixture]
    public class TestSuite
    {
        private Hook hook;
        private HookMovement hookMovement;
        private bool moveDown;

    [SetUp]
                public void Setup()
        {
            GameObject gameGameObject = MonoBehaviour.Instantiate(Resources.Load<gameobject>("Prefabs/Player/Hook"));
            hook = gameGameObject.GetComponent<hook>();
        }

        [TearDown]
        public void Teardown()
        {
            Object.Destroy(hook.gameObject);
        }

        [UnityTest]
        public IEnumerator HookMovesDown()
        {
            hookMovement.moveDown = true;
            Assert.True(hookMovement.moveDown);

            yield return null;
        }
    }


Но в конечном итоге я получаю ошибку CS1061: 'HookMovement' не содержит определения для 'moveDown', и не может быть найден доступный метод расширения 'moveDown', принимающий первый аргумент типа 'HookMovement' (вы пропускаете директиву using или ссылку на сборку?)


Richard MacCutchan

Вы заявили: HookMovement.moveDown как private, поэтому тестовый пакет не может получить к нему доступ. Вам нужно либо сделать это public, или создать общедоступный метод, который может манипулировать его значением.

BillWoodruff

Я думаю, что вы могли бы получить помощь на форуме Unity для тестирования и автоматизации:
https://forum.unity.com/forums/testing-automation.211/?direction=desc

Shayalp1

Ладно, спасибо.

Рейтинг:
2

BillWoodruff

The Unity Test Framework package (formerly the "Unity Test Runner") is a tool that allows you to test your code in both Edit mode and Play mode, and also on target platforms such as Standalone, Android, or iOS
.

For more information on other versions of the Test Framework package, see the com.unity.test-framework page.
попробовать это: [^]

Единство модульного тестирования основы в учебнике (на C#, Нанит) - давайте сделаем ...letsmakeagame.net "единство-юнит-тестирование-основы-учебник
7 июня 2020 года — Модульные тесты-это способ быть более уверенным в вносимых изменениях, способ уменьшить количество дефектов, поймать ошибки как можно скорее ...

Введение в модульное тестирование Unity | raywenderlich.comwww.raywenderlich.com - 9454-введение-в-единство...
22 мая 2019 года — как это работает в Unity с помощью Test Runner; написание и запуск модульных тестов, которые проходят. Примечание: этот учебник предполагает, что вы знакомы с C# и ...
Что такое модульный тест? · Просмотр примеров модульных тестов · написание вашего первого модульного теста

Модульное тестирование - Unity - Manualdocs.unity3d.com "ручное" тестирование-editortestsrunner
Отладка кода C# в Unity. Концепции сценариев. модульное тестирование. По мере роста вашего проекта растет и количество скриптов, фрагментов кода, что позволяет создавать свои собственные ...
Испытание Единства Бегун · Платформа Для Тестирования · Тест-Редактор Бегун · Испанский

Практическое модульное тестирование в Unity3D | by Kuldeep Singh ... - Mediummedium.com "xrpractices" практические-юнит-тестирование-в ООН...
17 ноября 2019 года — тесты Unity3D также являются своего рода интеграционным тестом, где мы тестируем полный жизненный цикл игрового объекта, см. ниже сообщение об основах настройки ...


BillWoodruff

Shayalp1 5hrs 20mins ago: "спасибо вам за ваше решение @BillWoodruff, я пытался это сделать, но мне просто нужен кто-то, чтобы направлять меня. Это то, что у меня есть до сих пор"

Я думаю, что вы могли бы получить помощь на форуме Unity для тестирования и автоматизации:
https://forum.unity.com/forums/testing-automation.211/?direction=desc